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

Vælg kolonneværdier som kolonner ved hjælp af PIVOT

Dine krav er ikke helt klare, men det ser ud til, at du forsøger at oprette en ny kolonne med navnet c med derefter en row_number() forbundet med det -- c1, c2 c3 osv. .

Hvis du skulle bruge følgende i din underforespørgsel:

SELECT Val1, Val2, 'C'+ cast(row_number() over(partition efter Val2 sorteret efter val1) som varchar(10)) colFROM TEMP1 

Se SQL Fiddle with Demo

Du ville få resultatet:

| VAL1 | VAL2 | COL |----------------------------| S01 | 00731 | C1 || S02 | 00731 | C2 || S03 | 00731 | C3 || S04 | 00731 | C4 || S05 | 00731 | C5 || S06 | 00731 | C6 || S07 | 00731 | C7 || S07 | 00731 | C8 || S08 | 00731 | C9 || S09 | 00731 | C10 || S04 | 00741 | C1 || S01 | 00746 | C1 || S01 | 00770 | C1 || S01 | 00771 | C1 || S02 | 00771 | C2 |

Hvilket ser ud til at være resultatet, at du så ønsker at PIVOT . Du skal derefter anvende PIVOT til dette ved hjælp af:

SELECT Val2, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10FROM( SELECT Val1, Val2, 'C'+ cast(row_number() over(partition efter Val2 rækkefølge efter val1) as varchar(10)) col FROM TEMP1) srcPIVOT( MAX(Val1) FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)) piv; 

Se SQL Fiddle with Demo . Dit endelige resultat er derefter:

| VAL2 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10 |------------------------------------------------ --------------------------------------------------| 00731 | S01 | S02 | S03 | S04 | S05 | S06 | S07 | S07 | S08 | S09 || 00741 | S04 | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) || 00746 | S01 | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) || 00770 | S01 | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) || 00771 | S01 | S02 | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (null) |

Bemærk:mine resultater er lidt anderledes end det, du anmoder om som det ønskede resultat, fordi jeg udfører en ORDER BY val1 som forårsager S07 værdier, der skal grupperes sammen.

Der er ingen rækkefølge af data i en database, medmindre du anmoder om en, så der er ingen garanti for, at en af ​​S07 værdier vises som C10 . Du kan bruge følgende til at få resultatet, men der er ingen garanti at resultatet altid vil være i den rigtige rækkefølge:

SELECT Val2, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10FROM( SELECT Val1, Val2, 'C'+ cast(row_number() over(partition efter Val2 rækkefølge efter (vælg 1)) som varchar(10)) col FROM TEMP1) srcPIVOT( MAX(Val1) FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)) piv; 

Se SQL Fiddle with Demo . Brug order efter (vælg 1) ændrer rækkefølgen af ​​dataene, men det garanterer ikke, at de altid vil være i den rækkefølge. Resultatet er:

| VAL2 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10 |------------------------------------------------ --------------------------------------------------| 00731 | S01 | S02 | S03 | S04 | S05 | S06 | S07 | S08 | S09 | S07 || 00741 | S04 | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) || 00746 | S01 | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) || 00770 | S01 | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) || 00771 | S01 | S02 | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (nul) | (null) |

  1. Få lignende længde- og breddegrad fra databasen

  2. 6 måder at kontrollere, om der findes en tabel i SQL Server (T-SQL-eksempler)

  3. Hvad bruger LISTAGG med ORDER BY NULL egentlig som bestillingskriterier?

  4. java.lang.ClassCastException:com.mchange.v2.c3p0.impl.NewProxyConnection