DEMO: http://rextester.com/IYDJ29385
- CTE mang lại cho tôi dữ liệu mẫu để chơi với
- CTE2 chỉ cần gán số hàng cho mỗi phép gánId và PersonId (bạn chỉ có thể sử dụng chế độ xem nội tuyến)
- Sau đó, chúng tôi sử dụng tuyên bố trường hợp để xoay vòng dữ liệu dựa trên số hàng được tạo. Sự sụp đổ của phương pháp này là tất cả 14 cột luôn được trả về. Sử dụng SQL động, bạn chỉ có thể hiển thị các cột đó khi cần.
Điều này giả định rằng mã định danhDi và personId và mã dự án là duy nhất. Nếu nhiều mã dự án có thể tồn tại cho cùng một nhiệm vụ và người đó thì chúng tôi sẽ cần phải làm điều gì đó khác thay vì tối đa.
WITH CTE (assignmentID, personID, projectCode, projectCodePercent) as (
SELECT 642, 13527, 511, 75.00 UNION ALL
SELECT 642, 13527, 621, 25.00 UNION ALL
SELECT 650, 12000, 555, 50.00 UNION ALL
SELECT 650, 12000, 520, 25.00 UNION ALL
SELECT 650, 12000, 621, 25.00 UNION ALL
SELECT 240, 56000, 721, 100.00),
cte2 as (SELECT A.*, row_number() over (partition by AssignmentID, PersonID order by projectCode) RN
FROM cte A)
SELECT AssignmentID
, PersonID
, max(CASE WHEN RN = 1 then projectCode end) as projectCode1
, max(CASE WHEN RN = 1 then ProjectcodePercent end) as ProjectcodePercent1
, max(CASE WHEN RN = 2 then projectCode end) as projectCode2
, max(CASE WHEN RN = 2 then ProjectcodePercent end) as ProjectcodePercent2
, max(CASE WHEN RN = 3 then projectCode end) as projectCode3
, max(CASE WHEN RN = 3 then ProjectcodePercent end) as ProjectcodePercent3
, max(CASE WHEN RN = 4 then projectCode end) as projectCode4
, max(CASE WHEN RN = 4 then ProjectcodePercent end) as ProjectcodePercent4
, max(CASE WHEN RN = 5 then projectCode end) as projectCode5
, max(CASE WHEN RN = 5 then ProjectcodePercent end) as ProjectcodePercent5
, max(CASE WHEN RN = 6 then projectCode end) as projectCode6
, max(CASE WHEN RN = 6 then ProjectcodePercent end) as ProjectcodePercent6
, max(CASE WHEN RN = 7 then projectCode end) as projectCode7
, max(CASE WHEN RN = 7 then ProjectcodePercent end) as ProjectcodePercent7
FROM CTE2
Group by AssignmentID, personId
Cho chúng tôi:
+----+--------------+----------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+
| | AssignmentID | PersonID | projectCode1 | ProjectcodePercent1 | projectCode2 | ProjectcodePercent2 | projectCode3 | ProjectcodePercent3 | projectCode4 | ProjectcodePercent4 | projectCode5 | ProjectcodePercent5 | projectCode6 | ProjectcodePercent6 | projectCode7 | ProjectcodePercent7 |
+----+--------------+----------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+
| 1 | 650 | 12000 | 520 | 25,00 | 555 | 50,00 | 621 | 25,00 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 2 | 642 | 13527 | 511 | 75,00 | 621 | 25,00 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 3 | 240 | 56000 | 721 | 100,00 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+----+--------------+----------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+--------------+---------------------+
gì định nghĩa các đơn đặt hàng kỷ lục? Tại sao 520 projectcode2 thay vì 555 hoặc 621? Ngẫu nhiên? không quan trọng? – xQbert
@xQbert Cảm ơn bạn đã làm rõ. thứ tự kỷ lục không quan trọng. –