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

Hiển thị các cột dưới dạng hàng trong SQL Server 2005

Để có được kết quả mà bạn muốn, trước tiên bạn cần UNPIVOT dữ liệu và sau đó PIVOT the Giá trị của DatePeriod.

UNPIVOT sẽ biến đổi nhiều cột của Transactions , CustomersVisits thành nhiều hàng. Các câu trả lời khác đang sử dụng UNION ALL để giải nén nhưng SQL Server 2005 là năm đầu tiên UNPIVOT chức năng đã được hỗ trợ.

Truy vấn để bỏ chia dữ liệu là:

select dateperiod,
  col, value
from transactions
unpivot
(
  value for col in (Transactions, Customers, Visits)
) u

Xem Demo . Điều này biến các cột hiện tại của bạn thành nhiều hàng, vì vậy dữ liệu trông giống như sau:

| DATEPERIOD |          COL | VALUE |
-------------------------------------
|   Jan 2012 | Transactions |   100 |
|   Jan 2012 |    Customers |    50 |
|   Jan 2012 |       Visits |   150 |
|   Feb 2012 | Transactions |   200 |

Bây giờ, vì dữ liệu nằm trong hàng, bạn có thể áp dụng PIVOT chức năng của DatePeriod cột:

select col, [Jan 2012], [Feb 2012], [Mar 2012]
from
(
  select dateperiod,
    t.col, value, c.SortOrder
  from
  (
    select dateperiod,
      col, value
    from transactions
    unpivot
    (
      value for col in (Transactions, Customers, Visits)
    ) u
  ) t
  inner join
  (
    select 'Transactions' col, 1 SortOrder
    union all
    select 'Customers' col, 2 SortOrder
    union all
    select 'Visits' col, 3 SortOrder
   ) c
    on t.col = c.col
) d
pivot
(
  sum(value)
  for dateperiod in ([Jan 2012], [Feb 2012], [Mar 2012])
) piv
order by SortOrder;

Xem SQL Fiddle with Demo .

Nếu bạn có một số khoảng thời gian ngày không xác định thì bạn sẽ sử dụng SQL động:

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

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

set @query = 'SELECT col, ' + @cols + ' 
             from 
             (
                select dateperiod,
                  t.col, value, c.SortOrder
                from
                (
                  select dateperiod,
                    col, value
                  from transactions
                  unpivot
                  (
                    value for col in (Transactions, Customers, Visits)
                  ) u
                ) t
                inner join
                (
                  select ''Transactions'' col, 1 SortOrder
                  union all
                  select ''Customers'' col, 2 SortOrder
                  union all
                  select ''Visits'' col, 3 SortOrder
                 ) c
                  on t.col = c.col
            ) x
            pivot 
            (
                sum(value)
                for dateperiod in (' + @cols + ')
            ) p 
            order by SortOrder'

execute(@query)

Xem SQL Fiddle với Demo . Cả hai sẽ cho kết quả:

|          COL | JAN 2012 | FEB 2012 | MAR 2012 |
-------------------------------------------------
| Transactions |      100 |      200 |      300 |
|    Customers |       50 |      100 |      200 |
|       Visits |      150 |      300 |      600 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo máy chủ được liên kết giữa hai vùng chứa Docker chạy SQL Server (Ví dụ T-SQL)

  2. Làm cách nào để khai báo biến vô hướng trong chế độ XEM trong Sql Server (2005)

  3. Cách tìm bảng chứa một cột cụ thể trong SQL Server

  4. Truy vấn để tìm Số tham số trong một Thủ tục hoặc Hàm được Lưu trữ trong Máy chủ Sql?

  5. SQL:mệnh đề in trong thủ tục được lưu trữ:cách chuyển giá trị