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

Chuyển đổi các hàng và cột mà không có tổng hợp

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 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trả lại danh sách các bảng từ một máy chủ được liên kết trong SQL Server (ví dụ T-SQL)

  2. Sử dụng SQL Server làm hàng đợi DB với nhiều máy khách

  3. Cập nhật giá trị khóa chính bằng khung thực thể

  4. Cách vô hiệu hóa ràng buộc khóa ngoại trong SQL Server (Ví dụ T-SQL)

  5. Cách lấy danh sách tất cả các Ràng buộc Kiểm tra trong Cơ sở dữ liệu SQL Server - Hướng dẫn SQL Server / TSQL Phần 85