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

Groepen rijen met dezelfde ID naar een andere tabel transponeren

Dit is inderdaad een spil, ook wel een kruistabel genoemd, of soms getransponeerd

Sommige databases hebben speciale faciliteiten om dit te doen, andere moet u een groeperingssyntaxis gebruiken. Ik geef de voorkeur aan het laatste omdat het universeel werkt

Als het een troost mag zijn, je was er heel dichtbij!

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

Hoe werkt het?

Nou, als je de niet-gegroepeerde versie met no-max-functies gebruikt die je al had:

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

Dan zie je dat je gegevens "diagonaal" worden:

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

In elke kolom (per dim_key) is er slechts één waarde, de rest is NULL

Door de GROUP BY en MAX toe te voegen, worden deze samengevouwen tot een enkele rij omdat MAX() alleen de waarde uit de kolom retourneert en alle nulls laat verdwijnen. Het is een intrinsieke eigenschap van een groepering dat de rijgegevens niet "bij elkaar blijven" - binnen de groep van een bepaalde DIM_KEY kan de MAX(DAIRY_CLM) uit elke rij komen, de MAX(KOSHER_CLM) kan uit elke andere rij komen.. In de praktijk betekent dit dat de enkele waarden worden gekozen, de nulls worden weggegooid, ze verschijnen allemaal op dezelfde rij..

..en dus gingen je verticale gegevens horizontaal, nadat ze door de diagonaal waren gegaan



  1. Databases en tabellen exporteren met PhpMyAdmin

  2. Constante #1064-fout bij alles wat ik doe in mySQL via phpMyAdmin

  3. phpmyadmin toont getallen of blob voor de utf8_bin-aanroepkolommen van mysql?

  4. Hoe te draaien zonder vaste kolommen te kennen in T-SQL