Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изберете стойности на колони като колони с помощта на PIVOT

Вашите изисквания не са напълно ясни, но изглежда, че се опитвате да създадете нова колона с име 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) променя реда на данните, но не гарантира, че винаги ще бъде в този ред. Резултатът е:

<предварителен код>| VAL2 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10 |------------------------------------------------ ------------------------------------------------| 00731 | S01 | S02 | S03 | S04 | S05 | S06 | S07 | S08 | S09 | S07 || 00741 | S04 | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) || 00746 | S01 | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) || 00770 | S01 | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) || 00771 | S01 | S02 | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (нула) | (null) |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ExecuteNonQuery:Свойството на връзката не е инициализирано.

  2. Как мога да извлека таблица от съхранена процедура в таблица с данни?

  3. Как да накарате водещите търсения в пълен текст да работят в SQL Server?

  4. Върнете оригиналното начало на колона за идентичност в SQL Server

  5. sp_executesql, което кара моята заявка да бъде много бавна