sql >> Database teknologi >  >> RDS >> Sqlserver

MSSQL dynamisk pivot kolonneværdier til kolonneoverskrift

Problemet med din nuværende forespørgsel er med linjen:

MAX(SERVER_ID) 

Du vil vise PROPERTY_CHAR_VAL for hver PROPERTY_NAME i stedet. SERVER_ID vil være en del af det endelige resultat som en kolonne.

Nogle gange, når du arbejder med PIVOT, er det lettere at skrive koden først med værdierne hårdkodet svarende til:

vælg id, navn1, navn2, navn3, navn4fra( vælg id, ejendomsnavn, ejendomsværdi fra din tabel) dpivot( max(egenskabsværdi) for ejendomsnavn i (navn1, navn2, navn3, navn4)) piv; 

Se SQL Fiddle with Demo .

Når du har en version, der har den korrekte logik, så kan du konvertere den til dynamisk SQL for at få resultatet. Dette vil oprette en sql-streng, der vil blive udført, og den vil inkludere alle dine nye kolonnenavne.

ERKLÆR @cols SOM NVARCHAR(MAX), @query AS NVARCHAR(MAX)vælg @cols =TING((SELECT distinct ',' + QUOTENAME(PROPERTY_NAME) fra din tabel FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='VÆLG id, ' + @cols + ' fra (vælg id, ejendomsnavn, ejendomsværdi fra din tabel) x pivot ( max(egenskabsværdi) for ejendomsnavn i (' + @cols + ') ) p 'execute sp_executesql @query; 

Se SQL Fiddle with Demo . Begge vil give et resultat:

| ID | NAVN1 | NAVN2 | NAVN3 | NAVN4 | NAVN6 ||----|--------|--------|--------|--------|------ --|| 1 | værdi | værdi | værdi | (nul) | (nul) || 2 | (nul) | værdi | (nul) | værdi | (nul) || 3 | (nul) | (nul) | (nul) | (nul) | værdi |


  1. Sådan forbedres rækkefølge efter ydeevne med joins i mysql

  2. Postgres returnerer en standardværdi, når en kolonne ikke eksisterer

  3. Mysql-transaktion:commit og rollback

  4. Implementering af MySQL Galera Cluster 4.0 på Amazon AWS EC2