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

Не мога да осея таблица с моята заявка?

Само за да разширим другите отговори, функцията PIVOT изисква някакъв вид агрегиране. Тъй като стойността, която искате да конвертирате от ред в колона, е низ, вие сте ограничени до използването на max() или min() агрегатна функция.

Докато @Muhammed Ali отговорът ще работи, когато имате едно AttributeName /AttributeValue двойка, ако имате няколко двойки за всеки ID , тогава ще върнете само max или min стойност.

Например, ако вашите примерни данни са:

INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V1');INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V4');INSERT INTO @MyTable VALUES ( 'A1', 'Atr2', 'A1V2'); ВМЪКНЕТЕ В СТОЙНОСТИ @MyTable ('A1', 'Atr3', 'A1V3'); ВМЪКНЕТЕ В СТОЙНОСТИ @MyTable ('A2', 'Atr1', 'A2V1');INSERT INTO @MyTable VALUES ('A2', 'Atr2', 'A2V2');INSERT INTO @MyTable VALUES ('A2', 'Atr3', 'A3V3'); 

Въпреки че имате няколко реда за комбинацията от A1 и Atr1 , другите заявки връщат само max(attributevalue) :

<предварителен код>| ID | ATR1 | ATR2 | ATR3 ||----|------|------|------|| A1 | A1V4 | A1V2 | A1V3 || A2 | A2V1 | A2V2 | A3V3 |

Предполагам, че всъщност бихте искали да върнете всички комбинации. Предлагам да разширите заявката си, за да включите функцията за прозорци, row_number() във вашето запитване. Тази заявка генерира уникална стойност, която след това ще бъде включена в групиращия аспект на PIVOT и ще ви позволи да върнете повече от един ред за всеки ID.

Чрез добавяне на row_number() , заявката ще бъде подобна на следната:

SELECT Id, [Atr1], [Atr2],[Atr3]FROM( SELECT ID, AttributeName, AttributeValue, row_number() over(partition by id, attributename order by attributevalue) seq FROM @MyTable) AS SourceTable PIVOT ( max(AttributeValue) FOR AttributeName IN ([ATR1], [ATR2], [ATR3])) AS pvtorder by id; 

Вижте SQL Fiddle с демонстрация . Ще получите резултат, който връща всички редове:

<предварителен код>| ID | ATR1 | ATR2 | ATR3 ||----|------|--------|--------|| A1 | A1V1 | A1V2 | A1V3 || A1 | A1V4 | (нула) | (нула) || A2 | A2V1 | A2V2 | A3V3 |

Ако имате проблеми с разбирането на концепцията за PIVOT, тогава бих предложил да разгледате използването на комбинация от агрегатна функция с CASE израз, за ​​да получите резултата. След това можете да видите групирането на последователността/id:

SELECT Id, max(случай, когато име на атрибут ='Atr1' след това край на стойност на атрибут) Atr1, max(случай, когато име на атрибут ='Atr2', след това край на стойност на атрибут) Atr2, макс (случай, когато име на атрибут ='Atr3', след това стойност на атрибут end) Atr3FROM( SELECT ID, AttributeName, AttributeValue, row_number() over(partition by id, attributename order by attributevalue) seq FROM @MyTable) AS SourceTable group by id, seq 

Вижте SQL Fiddle с демонстрация



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Раздробяване на SQL Server XML с Unicode знаци

  2. Как да стартирам генериран SQL от променлива?

  3. SQL Server Create View Index, който съдържа различни или групирани по

  4. Клауза WHERE, използваща стойности, които могат да бъдат NULL

  5. Извличане на данни от съхранена процедура, която има множество набори от резултати