2017-07-03 5 views
1

Dies scheint mir eine triviale Aufgabe zu sein, aber aufgrund (wahrscheinlich) mangelndem Verständnis des Schwenkmechanismus habe ich Probleme, eine Lösung dafür zu finden.Drehtische mit verwandten Spalten

Ich habe die folgende Tabelle mit Beispieldaten:

id  code created_datetime sourceID 
------ ---- ------------------- -------- 
481792 DEF  2016-12-04 18:31:00 398464 
481792 JKH  2016-12-04 18:31:00 398464 
486429 ABC  2010-09-07 09:29:00 302304 
486429 DEF  2009-02-05 03:04:00 320903 
486429 GHI  2009-02-05 03:04:00 320903 

Was ich mag als Ergebnis erhalten, ist eine Pivot auf der ‚Code‘ Spalte, eine Angabe, ob oder nicht dieser Code existiert für ein Ich würde. Die Spalte 'created_datetime' versuche ich mit SELECT DATEDIFF (DAY, created_datetime, CURRENT_TIMESTAMP) in eine Anzahl von Tagen zu konvertieren - und schließlich die sourceID. Ich hatte so etwas für das Ergebnis im Hinterkopf (ich hoffe wirklich, dass dies richtig formatiert ist):

id  ABC ABC_sou ABC_days_active DEF DEF_sou DEF_days_active GHI GHI_sou GHI_days_active JKH JKH_sou JKH_days_active 
------ --- ------- --------------- --- ------- --------------- --- ------- --------------- --- ------- --------------- 
481792 0       1 398464 211           1 398464 211 
486429 1 302304 2491   1 320903 3070   1 320903 3070 

Eine Linie pr. ID, das ist.

Was ich bisher versucht, ohne ganz dorthin zu gelangen, die von diesem Link inspiriert: PIVOT on Multiple Columns, und am Beispiel hier kam ich mit auf den Punkt:

select id, 
    [ABC], [ABC_source], [ABC_days_active], 
    [DEF], [DEF_source], [DEF_days_active], 
    [GHI], [GHI_source], [GHI_days_active], 
    [JKH], [JKH]_source], [JKH_days_active] 
from 
(
    SELECT id, 
       code, 
       source, 
       col, value 
     FROM MyTable 
    cross apply 
    (
    values 
     ([code], CASE code WHEN NULL THEN 0 ELSE 1 END), 
     ([code]+'_source', [source]), 
     ([code]+'_date', CAST(DATEDIFF(DAY,created_datetime,CURRENT_TIMESTAMP) AS varchar (20))) 
) c (col, value) 
) d 
pivot 
(
    max(value) 
    for col in ([ABC], [ABC_source], [ABC_date], [DEF], [DEF_source], [DEF_date], 
       [GHI], [GHI_source], [GHI_date], [JKH], [JKH_source], [JKH_date]) 
) piv; 

, die mir die richtigen Spalten gab (Spaltennamen), aber ich habe immer noch die gleiche Anzahl von Zeilen wie ich begonnen habe. (Und außerdem wird 0 nur als NULL angezeigt, aber damit kann ich leben.)

Können Sie mir einen Hinweis geben, um mich dorthin zu bringen? Es ist wahrscheinlich etwas das ich gerade nicht richtig interpretiert habe ...

+0

Versuchen Sie, 'piv. *' Auszuwählen. Sie haben die Spalten "_active" ausgewählt, obwohl sie nicht Teil des Pivots sind. Alle Spalten der 'FROM'-Klausel, die nicht im' PIVOT' verwendet werden, werden zum Gruppieren verwendet. Außerdem scheint es mir, dass Sie versuchen, zwei Spalten aus der Quellentabelle zu schwenken. 'PIVOT' unterstützt nur eine Spalte, um durch eine Aggregatfunktion zu schwenken. – Aquillo

+0

Aha! Das war es - DANKE Aquillo !! Wie kann ich Ihren Kommentar bei der Antwort markieren und Ihnen dafür Kredit geben? – kiro

+0

Sie können nicht, ich habe meinen Kommentar als Antwort gepostet. Froh, dass ich helfen konnte! – Aquillo

Antwort

0

Versuchen Sie piv.* auszuwählen. Sie haben die Spalten _active ausgewählt, die nicht zum Pivot gehören. Alle Spalten aus der FROM -Klausel, die nicht in der PIVOT verwendet werden, werden zum Gruppieren verwendet. Außerdem scheint es mir, dass Sie versuchen, zwei Spalten aus der Quellentabelle zu schwenken. PIVOT unterstützt nur eine Spalte, um durch eine Aggregatfunktion zu drehen.

Verwandte Themen