Yêu cầu của bạn không hoàn toàn rõ ràng nhưng có vẻ như bạn đang cố tạo một cột mới có tên c
sau đó là row_number()
được liên kết với nó - c1, c2 c3, etc
.
Nếu bạn sử dụng phần sau trong truy vấn con của mình:
SELECT Val1, Val2,
'C'+ cast(row_number() over(partition by Val2
order by val1) as varchar(10)) col
FROM TEMP1
Bạn sẽ nhận được kết quả:
| VAL1 | VAL2 | COL |
----------------------
| S01 | 00731 | C1 |
| S02 | 00731 | C2 |
| S03 | 00731 | C3 |
| S04 | 00731 | C4 |
| S05 | 00731 | C5 |
| S06 | 00731 | C6 |
| S07 | 00731 | C7 |
| S07 | 00731 | C8 |
| S08 | 00731 | C9 |
| S09 | 00731 | C10 |
| S04 | 00741 | C1 |
| S01 | 00746 | C1 |
| S01 | 00770 | C1 |
| S01 | 00771 | C1 |
| S02 | 00771 | C2 |
Đây dường như là kết quả mà bạn muốn PIVOT
. Sau đó, bạn sẽ áp dụng PIVOT
tới cái này bằng cách sử dụng:
SELECT Val2,
c1, c2, c3, c4, c5, c6, c7, c8, c9, c10
FROM
(
SELECT Val1, Val2,
'C'+ cast(row_number() over(partition by Val2
order by val1) as varchar(10)) col
FROM TEMP1
) src
PIVOT
(
MAX(Val1)
FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)
) piv;
Xem SQL Fiddle with Demo . Kết quả cuối cùng của bạn sau đó là:
| VAL2 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10 |
------------------------------------------------------------------------------------------------
| 00731 | S01 | S02 | S03 | S04 | S05 | S06 | S07 | S07 | S08 | S09 |
| 00741 | S04 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00746 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00770 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00771 | S01 | S02 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
Lưu ý:kết quả của tôi hơi khác so với kết quả bạn yêu cầu là kết quả mong muốn vì tôi đang thực hiện ORDER BY val1
nguyên nhân gây ra S07
các giá trị được nhóm lại với nhau.
Không có thứ tự dữ liệu nào trong cơ sở dữ liệu trừ khi bạn yêu cầu, vì vậy không có gì đảm bảo rằng một trong các S07
các giá trị sẽ xuất hiện dưới dạng C10
. Bạn có thể sử dụng những điều sau để nhận được kết quả nhưng không có gì đảm bảo rằng kết quả sẽ luôn theo đúng thứ tự:
SELECT Val2,
c1, c2, c3, c4, c5, c6, c7, c8, c9, c10
FROM
(
SELECT Val1, Val2,
'C'+ cast(row_number() over(partition by Val2
order by (select 1)) as varchar(10)) col
FROM TEMP1
) src
PIVOT
(
MAX(Val1)
FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)
) piv;
Xem SQL Fiddle with Demo
. Sử dụng order by (select 1)
thay đổi thứ tự của dữ liệu nhưng nó không đảm bảo rằng nó sẽ luôn theo thứ tự đó. Kết quả là:
| VAL2 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10 |
------------------------------------------------------------------------------------------------
| 00731 | S01 | S02 | S03 | S04 | S05 | S06 | S07 | S08 | S09 | S07 |
| 00741 | S04 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00746 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00770 | S01 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |
| 00771 | S01 | S02 | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) |