SSMS
 sql >> Datenbank >  >> Database Tools >> SSMS

Transponieren von Gruppen von Zeilen mit derselben ID in eine andere Tabelle

Dies ist in der Tat ein Pivot, auch Kreuztabelle oder manchmal Transposition genannt

Einige Datenbanken haben spezielle Einrichtungen dafür, andere müssen Sie eine Gruppierungssyntax verwenden. Ich bevorzuge letzteres, weil es universell funktioniert

Falls es dich tröstet, du warst wirklich nah dran!

SELECT
    DIM_KEY,
    MAX(CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END) as UPC,
    MAX(CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END) as DAIRY_CLM,
    MAX(CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END) as KOSHER_CLM,
    MAX(CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END) as FAT,
    MAX(CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END) as CALORIES
FROM demo
GROUP BY DIM_KEY

Wie funktioniert es?

Nun, wenn Sie die nicht gruppierte Version ohne maximale Funktionen ausführen, die Sie bereits hatten:

SELECT
    DIM_KEY,
    (CASE WHEN ATTR_NAME = 'UPC' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'DAIRY_CLM' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'KOSHER_CLM' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'FAT' THEN VALUE END),
    (CASE WHEN ATTR_NAME = 'CALORIES' THEN VALUE END)
FROM
   demo

Dann sehen Sie, dass Ihre Daten "diagonal" werden:

3005, 123423, null, null...
3005, null,   N,    null...
3005, null,   null, Y   ...

In jeder Spalte (pro dim_key) gibt es nur einen Wert, der Rest ist NULL

Das Hinzufügen von GROUP BY und MAX führt dazu, dass diese zu einer einzigen Zeile zusammenfallen, da MAX() nur den Wert aus der Spalte zurückgibt und alle Nullen verschwinden lässt. Es ist eine intrinsische Eigenschaft einer Gruppierung, dass die Zeilendaten nicht "zusammenbleiben" - innerhalb der Gruppe eines bestimmten DIM_KEY kann MAX(DAIRY_CLM) aus jeder Zeile stammen, MAX(KOSHER_CLM) aus jeder anderen Zeile. In der Praxis bedeutet dies, dass die einzelnen Werte ausgewählt werden, die Nullen verworfen werden und alle in derselben Zeile erscheinen..

..und somit wurden Ihre vertikalen Daten horizontal, nachdem sie die Diagonale durchlaufen hatten