Ihre Anforderungen sind nicht ganz klar, aber es sieht so aus, als ob Sie versuchen, eine neue Spalte mit dem Namen c
zu erstellen mit dann einer row_number()
damit verbunden -- c1, c2 c3, etc
.
Wenn Sie Folgendes in Ihrer Unterabfrage verwenden würden:
SELECT Val1, Val2,
'C'+ cast(row_number() over(partition by Val2
order by val1) as varchar(10)) col
FROM TEMP1
Siehe SQL Fiddle mit Demo
Sie würden das Ergebnis erhalten:
| 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 |
Das scheint das Ergebnis zu sein, dass Sie dann PIVOT
wollen . Sie würden dann den PIVOT
anwenden dazu mit:
SELECT Val2,
c1, c2, c3, c4, c5, c6, c7, c8, c9, c10
FROM
(
SELECT Val1, Val2,
'C'+ cast(row_number() over(partition by Val2
order by val1) as varchar(10)) col
FROM TEMP1
) src
PIVOT
(
MAX(Val1)
FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)
) piv;
Siehe SQL Fiddle mit Demo . Ihr Endergebnis ist dann:
| VAL2 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10 |
------------------------------------------------------------------------------------------------
| 00731 | S01 | S02 | S03 | S04 | S05 | S06 | S07 | S07 | S08 | S09 |
| 00741 | S04 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00746 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00770 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00771 | S01 | S02 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
Hinweis:Meine Ergebnisse unterscheiden sich geringfügig von dem, was Sie als gewünschtes Ergebnis anfordern, da ich eine ORDER BY val1
durchführe was den S07
verursacht Werte gruppiert werden.
Es gibt keine Reihenfolge von Daten in einer Datenbank, es sei denn, Sie fordern eine an, daher gibt es keine Garantie dafür, dass einer der S07
Werte werden als C10
angezeigt . Sie können Folgendes verwenden, um das Ergebnis zu erhalten, aber es gibt keine Garantie dass das Ergebnis immer in der richtigen Reihenfolge angezeigt wird:
SELECT Val2,
c1, c2, c3, c4, c5, c6, c7, c8, c9, c10
FROM
(
SELECT Val1, Val2,
'C'+ cast(row_number() over(partition by Val2
order by (select 1)) as varchar(10)) col
FROM TEMP1
) src
PIVOT
(
MAX(Val1)
FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)
) piv;
Siehe SQL-Fiddle mit Demo
. Verwenden Sie den order by (select 1)
ändert die Reihenfolge der Daten, aber es garantiert nicht, dass sie immer in dieser Reihenfolge sein werden. Das Ergebnis ist:
| VAL2 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10 |
------------------------------------------------------------------------------------------------
| 00731 | S01 | S02 | S03 | S04 | S05 | S06 | S07 | S08 | S09 | S07 |
| 00741 | S04 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00746 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00770 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00771 | S01 | S02 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |