Вашите изисквания не са напълно ясни, но изглежда, че се опитвате да създадете нова колона с име c
със след това row_number()
свързани с него -- c1, c2 c3 и т.н.
.
Ако трябваше да използвате следното във вашата подзаявка:
SELECT Val1, Val2, 'C'+ cast(row_number() over(partition by Val2 order by val1) as varchar(10)) colFROM TEMP1
Вижте SQL Fiddle с демонстрация
Ще получите резултата:
<предварителен код>| 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 |
Което изглежда е резултатът, който след това искате да PIVOT
. След това ще приложите PIVOT
към това чрез:
SELECT Val2, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10FROM( SELECT Val1, Val2, 'C'+ cast(row_number() over(partition by Val2 order by val1) като varchar(10)) col FROM TEMP1) srcPIVOT( MAX(Val1) FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)) piv;
Вижте SQL Fiddle с демонстрация . Тогава вашият краен резултат е:
<предварителен код>| VAL2 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10 |------------------------------------------------ ------------------------------------------------| 00731 | S01 | S02 | S03 | S04 | S05 | S06 | S07 | S07 | S08 | S09 || 00741 | S04 | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) || 00746 | S01 | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) || 00770 | S01 | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) || 00771 | S01 | S02 | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (null) |
Забележка:моите резултати са малко по-различни от това, което искате като желан резултат, защото изпълнявам ORDER BY val1
което причинява S07
стойности, които да бъдат групирани заедно.
Няма ред на данните в база данни, освен ако не поискате такава, така че няма гаранция, че една от S07
стойностите ще се показват като C10
. Можете да използвате следното, за да получите резултата, но няма гаранция че резултатът винаги ще бъде в правилния ред:
SELECT Val2, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10FROM( SELECT Val1, Val2, 'C'+ cast(row_number() over(partition by Val2 order by (изберете 1)) като varchar(10)) col FROM TEMP1) srcPIVOT( MAX(Val1) FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)) piv;код>
Вижте SQL Fiddle с демонстрация
. Използване на подреждане по (изберете 1)
променя реда на данните, но не гарантира, че винаги ще бъде в този ред. Резултатът е: