sql >> Databasteknik >  >> RDS >> Mysql

Finns det ett sätt att pivotera rader till kolumner i MySQL utan att använda CASE?

Länken som Kangkan tillhandahöll kommer att visa dig hur du gör detta om du känt till kolumnnamnen i förväg. Vi går för samma logik, förutom att använda dynamisk SQL för att bygga satsen. Det finns 2 delar till varje fält som du måste inkludera, fältet i select-satsen och en lämplig sammanfogning för att få värdet...så vi måste bygga upp satsen i två delar

Deklarera först 3 variabler för att bygga detta...Jag använder @select, @join och @sql för det här exemplet. Ge variablerna startvärdena

 set @select = 'select user_id,'
 set @join = 'from table t'

deklarera och ladda nu en markör med de distinkta värdena i fältet table.key. Jag kommer att använda @field eftersom variabeln fylls i med det distinkta fältet table.key. Gå sedan igenom den och bygg de två variablerna:

 set @select = @select + ', ' + @field + '.value as '[email protected]+'
 set @join = @join + ' left join table ' + @field + 'on '[email protected]+'.key = t.key and and '[email protected]+'.user_id = t.user_id

(kopplingen är utformad för att använda värdet i @field som alias för tabellen)

gå igenom markören genom att bygga ut @select och @join. I slutet av slingan:

set @sql = @select + @join + 'where clause if you want'
exec @sql

Dynamisk SQL byggd som denna kan vara en absolut smärta att felsöka (och göra rätt) och öppna upp säkerhetsproblem ... men det är ungefär det enda sättet jag kan se detta uppnått. Håll utkik efter storleksbegränsningar på dina variabler....om du har för många distinkta nyckel där, växer variablerna för stora. Tyvärr kan jag inte vara mer exakt med pseudon på detta...du kommer att tycka att det är mödosamt att bygga dynamisk SQL i SQL.




  1. MySQL där DateTime är större än idag

  2. Granska dina sessionsinställningar med SESSIONPROPERTY() i SQL Server

  3. Postgresql SQL GROUP BY tidsintervall med godtycklig noggrannhet (ned till millisekunder)

  4. generera_series() motsvarande i MySQL