Sử dụng ROW_NUMBER()
. Đầu tiên, gán cho mỗi bản ghi một số hàng:
SELECT cca.ClientContactId,
a.Description,
RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId
ORDER BY a.AttributeId)
FROM ClientContactAttributes AS cca
INNER JOIN Attributes AS a
ON a.AttributeId = cca.AttributeId;
Sau đó, bạn có thể sử dụng RowNumber
này cột thành PIVOT
dữ liệu của bạn:
WITH Data AS
( SELECT cca.ClientContactId,
a.Description,
RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId
ORDER BY a.AttributeId)
FROM ClientContactAttributes AS cca
INNER JOIN Attributes AS a
ON a.AttributeId = cca.AttributeId
)
SELECT pvt.ClientContactID,
Attribute1 = pvt.[1],
Attribute2 = pvt.[2],
Attribute3 = pvt.[3],
Attribute4 = pvt.[4]
FROM Data
PIVOT
( MAX(Description)
FOR RowNumber IN ([1], [2], [3], [4])
) AS pvt;
CHỈNH SỬA
Nếu bạn chưa hiểu thì mình trả lời chưa đúng! Tôi là một người tin tưởng chắc chắn vào câu tục ngữ "cho một người một con cá và bạn cho anh ta ăn một ngày; dạy một người câu cá và bạn nuôi anh ta suốt đời"
Nếu bạn có dữ liệu sau trong hai bảng của mình:
Thuộc tính '
AttributeId | Description
------------+---------------
1 | Bed
2 | Bath
3 | Beyond
ClientContactAttributes
ClientContactID | AttributeId
----------------+---------------
1 | 1
1 | 2
1 | 3
2 | 1
Chạy như sau:
SELECT cca.ClientContactId,
a.Description,
RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId
ORDER BY a.AttributeId)
FROM ClientContactAttributes AS cca
INNER JOIN Attributes AS a
ON a.AttributeId = cca.AttributeId;
Sẽ cung cấp cho bạn:
ClientContactID | Description | RowNumber
----------------+-------------+-----------
1 | Bed | 1
1 | Bath | 2
1 | Beyond | 3
2 | Bed | 1
ROW_NUMBER()
hàm chỉ cần gán một số duy nhất cho mỗi nhóm (được định nghĩa trong PARTITION BY
), và con số này được xác định bởi ORDER BY
mệnh đề. vì vậy dòng này:
ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId ORDER BY a.AttributeId)
Về cơ bản là nói, đối với mỗi giá trị duy nhất của cca.ClientContactId
Tôi muốn một số duy nhất, bắt đầu từ 1, trong đó giá trị thấp nhất của attributeId
nhận 1 và số gia tăng từ đó:
Hàm PIVOT, giống như một bảng tổng hợp excel, nơi bạn muốn chuyển các hàng thành cột. Nó có hai phần cơ bản và tôi sẽ làm việc ngược lại ở đây. Phần đầu tiên là FOR
mệnh đề:
FOR RowNumber IN ([1], [2], [3], [4])
Đây là các giá trị từ RowNumber
cột mà bạn muốn chuyển thành hàng. Các tên cột sẽ tương ứng với các giá trị được cung cấp. Phần thứ hai (đọc một cách logic đầu tiên), xác định các giá trị sẽ đi vào các cột mới được tạo này. Đây phải là một hàm tổng hợp và trong trường hợp này, nó là:
MAX(Description)
Vì bạn đã biết rằng RowNumber
là duy nhất cho mỗi ClientContactId
, hàm tổng hợp (được yêu cầu cho PIVOT`) thực sự vô nghĩa, vì chỉ có một giá trị cho mô tả để tổng hợp.
Hy vọng rằng điều này có ý nghĩa hơn một chút.