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

Chuyển đổi hiệu quả các hàng thành cột trong máy chủ sql

Có một số cách để bạn có thể chuyển đổi dữ liệu từ nhiều hàng thành cột.

Sử dụng PIVOT

Trong SQL Server, bạn có thể sử dụng PIVOT chức năng chuyển đổi dữ liệu từ hàng thành cột:

select Firstname, Amount, PostalCode, LastName, AccountNumber
from
(
  select value, columnname
  from yourtable
) d
pivot
(
  max(value)
  for columnname in (Firstname, Amount, PostalCode, LastName, AccountNumber)
) piv;

Xem Demo.

Xoay vòng với số lượng columnnames không xác định

Nếu bạn có một số lượng columnnames không xác định mà bạn muốn chuyển đổi, thì bạn có thể sử dụng SQL động:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(ColumnName) 
                    from yourtable
                    group by ColumnName, id
                    order by id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = N'SELECT ' + @cols + N' from 
             (
                select value, ColumnName
                from yourtable
            ) x
            pivot 
            (
                max(value)
                for ColumnName in (' + @cols + N')
            ) p '

exec sp_executesql @query;

Xem Demo.

Sử dụng hàm tổng hợp

Nếu bạn không muốn sử dụng PIVOT thì bạn có thể sử dụng một hàm tổng hợp với CASE biểu thức:

select
  max(case when columnname = 'FirstName' then value end) Firstname,
  max(case when columnname = 'Amount' then value end) Amount,
  max(case when columnname = 'PostalCode' then value end) PostalCode,
  max(case when columnname = 'LastName' then value end) LastName,
  max(case when columnname = 'AccountNumber' then value end) AccountNumber
from yourtable

Xem Demo.

Sử dụng nhiều phép nối

Điều này cũng có thể được hoàn thành bằng cách sử dụng nhiều phép nối, nhưng bạn sẽ cần một số cột để liên kết từng hàng mà bạn không có trong dữ liệu mẫu của mình. Nhưng cú pháp cơ bản sẽ là:

select fn.value as FirstName,
  a.value as Amount,
  pc.value as PostalCode,
  ln.value as LastName,
  an.value as AccountNumber
from yourtable fn
left join yourtable a
  on fn.somecol = a.somecol
  and a.columnname = 'Amount'
left join yourtable pc
  on fn.somecol = pc.somecol
  and pc.columnname = 'PostalCode'
left join yourtable ln
  on fn.somecol = ln.somecol
  and ln.columnname = 'LastName'
left join yourtable an
  on fn.somecol = an.somecol
  and an.columnname = 'AccountNumber'
where fn.columnname = 'Firstname'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối các ứng dụng chạy trên Linux với Amazon Relational Database Services (RDS) for SQL Server

  2. Làm cách nào để mở rộng các giá trị được phân tách bằng dấu phẩy thành các hàng riêng biệt bằng SQL Server 2005?

  3. Giới hạn các hàng được trả lại trong truy vấn SQL Server bằng cách sử dụng mệnh đề TOP

  4. Hiểu SQL Server ALTER TABLE ADD COLUMN Statement

  5. Cách thêm HOẶC Thả cột từ bảng đã bật CDC mà không làm mất dữ liệu trong cơ sở dữ liệu SQL Server - Hướng dẫn sử dụng SQL Server