Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Không thể xoay bảng với truy vấn của tôi?

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 A1Atr1 , 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

Xem SQL Fiddle với Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không hỗ trợ OVER trong MS SQL Server 2005?

  2. Khung thực thể - Kích thước hàng lớn hơn kích thước hàng tối đa cho phép là 8060

  3. Tạo tập lệnh trong SQL Server Management Studio

  4. Chuyển một tham số nhiều giá trị thành một bảng tạm thời trong SQL Server Business Intelligence Development Studio

  5. Sử dụng bộ giá trị trong mệnh đề SQL IN