Chỉ để mở rộng cho các câu trả lời khác, hàm PIVOT yêu cầu một số kiểu tổng hợp. Vì giá trị mà bạn muốn chuyển đổi từ một hàng thành một cột là một chuỗi, nên bạn bị hạn chế sử dụng max()
hoặc min()
chức năng tổng hợp.
Trong khi @Muhammed Ali's
câu trả lời sẽ hoạt động khi bạn có một AttributeName
duy nhất / AttributeValue
ghép nối, nếu bạn có nhiều cặp cho mỗi ID
, thì bạn sẽ chỉ trả về max
hoặc min
giá trị.
Ví dụ:nếu dữ liệu mẫu của bạn là:
INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V1');
INSERT INTO @MyTable VALUES ('A1', 'Atr1', 'A1V4');
INSERT INTO @MyTable VALUES ('A1', 'Atr2', 'A1V2');
INSERT INTO @MyTable VALUES ('A1', 'Atr3', 'A1V3');
INSERT INTO @MyTable VALUES ('A2', 'Atr1', 'A2V1');
INSERT INTO @MyTable VALUES ('A2', 'Atr2', 'A2V2');
INSERT INTO @MyTable VALUES ('A2', 'Atr3', 'A3V3');
Mặc dù bạn có nhiều hàng cho sự kết hợp của A1
và Atr1
, các truy vấn khác chỉ trả về max(attributevalue)
:
| ID | ATR1 | ATR2 | ATR3 |
|----|------|------|------|
| A1 | A1V4 | A1V2 | A1V3 |
| A2 | A2V1 | A2V2 | A3V3 |
Tôi đoán rằng bạn thực sự muốn trả lại tất cả các kết hợp. Tôi khuyên bạn nên mở rộng truy vấn của mình để bao gồm hàm cửa sổ, row_number()
trong truy vấn của bạn. Truy vấn này tạo ra một giá trị duy nhất sau đó sẽ được đưa vào khía cạnh nhóm của PIVOT và sẽ cho phép bạn trả về nhiều hơn một hàng cho mỗi ID.
Bằng cách thêm row_number()
, truy vấn sẽ tương tự như sau:
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 pvt
order by id;
Xem SQL Fiddle với Demo . Bạn sẽ nhận được kết quả trả về tất cả các hàng:
| ID | ATR1 | ATR2 | ATR3 |
|----|------|--------|--------|
| A1 | A1V1 | A1V2 | A1V3 |
| A1 | A1V4 | (null) | (null) |
| A2 | A2V1 | A2V2 | A3V3 |
Nếu bạn gặp khó khăn khi nắm bắt khái niệm PIVOT, thì tôi khuyên bạn nên xem xét việc sử dụng kết hợp một hàm tổng hợp với một biểu thức CASE để nhận được kết quả. Sau đó, bạn có thể thấy nhóm của chuỗi / id:
SELECT Id,
max(case when attributename = 'Atr1' then attributevalue end) Atr1,
max(case when attributename = 'Atr2' then attributevalue end) Atr2,
max(case when attributename = 'Atr3' then attributevalue end) Atr3
FROM
(
SELECT ID, AttributeName, AttributeValue,
row_number() over(partition by id, attributename
order by attributevalue) seq
FROM @MyTable
) AS SourceTable
group by id, seq