Nếu bạn định áp dụng PIVOT
, bạn sẽ cần sử dụng một hàm tổng hợp để nhận được kết quả nhưng bạn cũng sẽ muốn sử dụng một hàm cửa sổ như row_number()
để tạo một chuỗi duy nhất cho từng địa chỉ liên hệ trong tài khoản.
Đầu tiên, bạn sẽ truy vấn dữ liệu của mình tương tự như:
select account, contact,
'contact'
+ cast(row_number() over(partition by account
order by contact) as varchar(10)) seq
from yourtable
Xem SQL Fiddle với Demo. Thao tác này sẽ tạo một cột mới với trình tự duy nhất:
| ACCOUNT | CONTACT | SEQ |
|---------|-----------|----------|
| 1 | 324324324 | contact1 |
| 1 | 674323234 | contact2 |
Nếu bạn có một số lượng hạn chế các cột, thì bạn có thể viết mã cho truy vấn của mình:
select account,
contact1, contact2, contact3, contact4
from
(
select account, contact,
'contact'
+ cast(row_number() over(partition by account
order by contact) as varchar(10)) seq
from yourtable
) d
pivot
(
max(contact)
for seq in (contact1, contact2, contact3, contact4)
) piv;
Xem SQL Fiddle với Demo
Nếu bạn có một số lượng cột không xác định, thì bạn sẽ phải sử dụng SQL động:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(seq)
from
(
select 'contact'
+ cast(row_number() over(partition by account
order by contact) as varchar(10)) seq
from yourtable
) d
group by seq
order by seq
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT account, ' + @cols + '
from
(
select account, contact,
''contact''
+ cast(row_number() over(partition by account
order by contact) as varchar(10)) seq
from yourtable
) x
pivot
(
max(contact)
for seq in (' + @cols + ')
) p '
execute sp_executesql @query;
Xem SQL Fiddle với Demo. Cả hai sẽ cho bạn kết quả là:
| ACCOUNT | CONTACT1 | CONTACT2 | CONTACT3 | CONTACT4 |
|---------|-----------|-----------|-----------|-----------|
| 1 | 324324324 | 674323234 | (null) | (null) |
| 2 | 433243443 | 833343432 | (null) | (null) |
| 3 | 787655455 | (null) | (null) | (null) |
| 4 | 455435435 | 754327545 | (null) | (null) |
| 5 | 432432432 | 432433242 | 432455553 | 543544355 |