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

SQL Server:Pivot med brugerdefinerede kolonnenavne

Der er et par måder, du kan gøre dette på.

Hvis du havde et kendt antal spørgsmål/svar, kunne du bruge row_number() sammen med en aggregeret funktion og et CASE-udtryk:

vælg id, max(tilfælde når rn =1 derefter spørgsmål slutning) spørgsmål1, max(tilfælde når rn =1 så svar slutning) svar1, max(tilfælde når rn =2 så spørgsmål slutning) spørgsmål2, max( tilfælde, når rn =2, så svar slut) svar2, max(tilfælde, når rn =3, så spørgsmålet slutter) spørgsmål3, max(tilfælde, når rn =3, så svar slut) svar3fra( vælg id, spørgsmål, svar, rækkenummer() over(partition efter id rækkefølge efter id, spørgsmål) rn fra yt) srcgroup by id; 

Se SQL Fiddle with Demo

Et andet forslag ville være at bruge både UNPIVOT- og PIVOT-funktionen for at få resultatet. UNPIVOT vil besvare dit spørgsmål og svar kolonner og konverter dem til flere rækker.

Den grundlæggende syntaks for UNPIVOT vil være:

vælg id, col+cast(rn som varchar(10)) col, valuefrom( -- når du udfører en unpivot, skal datatyperne være de samme. -- du skal muligvis caste datatyperne i denne forespørgsel vælg id, spørgsmål, cast(svar som varchar(500)) svar, rækkenummer() over(partition efter id rækkefølge efter id, spørgsmål) rn fra yt) srcunpivot(værdi for col in (spørgsmål, svar)) unpiv; 

Se Demo . Dette giver et resultat:

| ID | COL | VÆRDI |------------------------------------------------ --------------| 4482515 | spørgsmål 1 | Jeg vil gerne have besked på mail. || 4482515 | svar1 | Nej || 4482515 | spørgsmål 2 | Planlægger at købe? || 4482515 | svar2 | Over 12 måneder || 4482515 | spørgsmål 3 | Testspørgsmålstekst || 4482515 | svar3 | nogle svar |

Som du kan se, tilføjede jeg en row_number() værdi til den indledende underforespørgsel, så du kan knytte hvert svar til spørgsmålet. Når dette er blevet deaktiveret, kan du pivotere resultatet på de nye kolonnenavne med spørgsmålet /svar med den sammenkædede rækkenummerværdi. Koden med PIVOT-syntaksen vil være:

vælg id, spørgsmål1, svar1, spørgsmål2, svar2, spørgsmål3, svar3fra( vælg id, col+cast(rn som varchar(10)) col, værdi fra ( -- når du udfører en unpivot, har datatyperne for at være det samme. -- du skal muligvis caste datatyperne i denne forespørgsel vælg id, spørgsmål, cast(svar som varchar(500)) svar, rækkenummer() over(partition efter id rækkefølge efter id, spørgsmål) rn fra yt ) src unpivot ( værdi for col in (spørgsmål, svar) ) unpiv) dpivot( max(værdi) for col in (spørgsmål1, svar1, spørgsmål2, svar2, spørgsmål3, svar3)) piv; 

Se SQL Fiddle with Demo . Nu i din situation sagde du, at du vil have et dynamisk antal spørgsmål/svar. Hvis det er tilfældet, skal du bruge dynamisk SQL for at få resultatet:

ERKLÆR @cols SOM NVARCHAR(MAX), @query AS NVARCHAR(MAX)vælg @cols =TING((SELECT ',' + QUOTENAME(c.col+cast(rn as varchar(10))) fra (vælg rækkenummer() over(partition efter id rækkefølge efter id, spørgsmål) rn fra yt ) d kryds anvende (vælg 'spørgsmål' col, 1 sorter union alle vælg 'svar', 2) c grupper efter col, rn, sort sorter efter rn, sorter FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')set @query ='SELECT id, ' + @cols + ' from ( vælg id, col+cast(rn som varchar(10)) col, værdi fra ( -- når du udfører en unpivot, skal datatyperne være de samme. -- du skal muligvis caste datatyperne i denne forespørgsel vælg id, spørgsmål, cast(svar som varchar(500)) svar, rækkenummer() over(partition efter id rækkefølge efter id, spørgsmål) rn fra yt ) src unpivot (værdi for col in (spørgsmål, svar) ) unpiv ) d pivot ( max(værdi) for col in (' + @cols + ') ) p 'execute(@query); 

Se SQL Fiddle with Demo . Disse giver et resultat:

| ID | SPØRGSMÅL 1 | SVAR1 | SPØRGSMÅL 2 | SVAR2 | SPØRGSMÅL 3 | SVAR3 |------------------------------------------------ -------------------------------------------------- ----------------------------------| 4482515 | Jeg vil gerne have besked på mail. | Nej | Planlægger at købe? | Over 12 måneder | Testspørgsmålstekst | nogle svar |


  1. hvordan man laver en tabel i oracle

  2. Hvordan gemmer man mere end 255 tegn i MySQL-databasen?

  3. Null EntityManager ved hjælp af @PersistenceContext

  4. SQL Server Trigger:Forståelse og alternativer