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

Transponering af grupper af rækker med samme ID til en anden tabel

Dette er faktisk en pivot, også kaldet en krydstabul, eller nogle gange transponerer

Nogle databaser har dedikerede faciliteter til at gøre det, andre skal du bruge en grupperingssyntaks. Jeg foretrækker det sidste, fordi det virker universelt

Hvis det er nogen trøst, så var du virkelig tæt på!

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

Hvordan virker det?

Nå, hvis du kører den ikke-grupperede, no-max-functions version, som du allerede havde:

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

Så vil du se dine data blive "diagonale":

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

I hver kolonne (pr. dim_key) er der kun én værdi, resten er NULL

Tilføjelse af GROUP BY og MAX får disse til at kollapse i en enkelt række, fordi MAX() vil returnere kun værdien fra kolonnen og få alle nullerne til at forsvinde. Det er en iboende egenskab ved en gruppering, at rækkedataene ikke "bliver sammen" - inden for gruppen af ​​en bestemt DIM_KEY kan MAX(DAIRY_CLM) komme fra enhver række, MAX(KOSHER_CLM) kan komme fra enhver anden række. I praksis betyder det, at de enkelte værdier vælges, nullerne kasseres, de vises alle på samme række.

..og dermed gik dine lodrette data vandret, efter at have gået gennem diagonalen



  1. phpMyAdmin-opdatering til 4.3.6 genererer Udefineret indeks:navwork-fejl

  2. mySQL-forespørgsel for at søge efter en streng i alle tabeller i en database?

  3. En gyldig destinationsmappe for installationen kunne ikke bestemmes ved installation af SQL Server Management Studio 2016

  4. Sådan importeres flere csv-filer til en MySQL-database