Само за да разширим другите отговори, функцията 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)
:
Предполагам, че всъщност бихте искали да върнете всички комбинации. Предлагам да разширите заявката си, за да включите функцията за прозорци, 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 с демонстрация