sql >> Databáze >  >> Database Tools >> SSMS

Transponování skupin řádků se stejným ID do jiné tabulky

Toto je skutečně pivot, nazývaný také kontingenční tabulka nebo někdy transpozice

Některé databáze pro to mají vyhrazená zařízení, jiné musíte použít syntaxi seskupení. Dávám přednost tomu druhému, protože funguje univerzálně

Pokud je to nějaká útěcha, byli jste opravdu blízko!

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

Jak to funguje?

No, pokud spustíte neseskupenou verzi bez maximálních funkcí, kterou jste již měli:

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

Poté uvidíte, že se vaše data stanou "úhlopříčně":

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

V každém sloupci (na dim_key) je pouze jedna hodnota, ostatní jsou NULL

Přidání GROUP BY a MAX způsobí, že se tyto sbalí do jednoho řádku, protože MAX() vrátí pouze hodnotu ze sloupce a všechny hodnoty null zmizí. Je to vnitřní vlastnost seskupení, že data řádku „nezůstávají pohromadě“ – v rámci skupiny konkrétního DIM_KEY může MAX(DAIRY_CLM) pocházet z libovolného řádku, MAX(KOSHER_CLM) může pocházet z jakéhokoli jiného řádku. V praxi to znamená, že jsou vybrány jednotlivé hodnoty, nuly jsou vyřazeny, všechny se objeví na stejném řádku..

..a vaše vertikální data tedy šla horizontálně poté, co prošli úhlopříčkou



  1. Špatné odhady mohutnosti pocházející z plánů provádění SSMS

  2. Dotaz MySQL k získání modálních průměrů sloupce?

  3. Připojte se k externímu serveru pomocí phpMyAdmin

  4. Problém s importem/nahrazením tabulky v CSV v phpMyAdmin:Neplatný počet sloupců ve vstupu CSV na řádku 1