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

SQL 2012 - Pivot và Unpivot

Bạn có thể sử dụng SQL động để chuyển đổi bảng:

DECLARE @cols NVARCHAR(MAX) = 
                STUFF((SELECT DISTINCT ',' + QUOTENAME(CONCAT([Year], '_', [Month]))
                      FROM #tab
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                     , 1, 1, '');

DECLARE @query NVARCHAR(MAX) = 
FORMATMESSAGE(
N'SELECT col_name, customer, %s
FROM (SELECT [year_month] = CONCAT([Year], ''_'', [Month]),
             Customer, No_Trans, spend, points
      FROM #tab) AS sub
UNPIVOT
(
    val FOR col_name  IN (No_trans, spend, points)
) AS unpvt
PIVOT
(
    MAX(val) FOR [year_month] IN (%s)
) AS pvt
ORDER BY customer, col_name;', @cols, @cols); 

EXEC [dbo].[sp_executesql] @query;

LiveDemo

Đầu ra:

╔══════════╦══════════╦════════╦════════╦════════╗
║   col    ║ customer ║ 2015_1 ║ 2015_2 ║ 2015_3 ║
╠══════════╬══════════╬════════╬════════╬════════╣
║ No_Trans ║        1 ║     30 ║     20 ║     10 ║
║ points   ║        1 ║     10 ║      5 ║     15 ║
║ spend    ║        1 ║    400 ║    150 ║    500 ║
║ No_Trans ║        2 ║      5 ║        ║        ║
║ points   ║        2 ║      7 ║        ║        ║
║ spend    ║        2 ║    100 ║        ║        ║
╚══════════╩══════════╩════════╩════════╩════════╝

Nếu bạn muốn zeros ở vị trí bị thiếu, bạn có thể sử dụng ISNULL/COALESCE . Lưu ý rằng không phải mọi loại dữ liệu đều có thể được thay thế bằng 0 (int)

LiveDemo2

CHỈNH SỬA:

FORMATMESSAGE là cách ưa thích để thay thế %s với chuỗi. Nó có thể dễ dàng thay đổi bằng REPLACE đơn giản :

 DECLARE @query NVARCHAR(MAX) = 
 N'SELECT col1, col2, <placeholder>
   FROM ...
   ...
   PIVOT( MAX(col) IN col2 IN (<placeholder>)
   ...';

 SET @query = REPLACE(@query, '<placeholder', @cols);

 -- for debug
 PRINT @query;

Cách hoạt động:

  1. Tạo [year_month] cột trong truy vấn con
  2. UNPIVOT dữ liệu (cột thành hàng)
  3. PIVOT kết quả (hàng đến cột)
  4. Kết hợp nó với dynamic-SQL để cho phép tạo các cột mà không cần biết [year_month] trước.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách nhập tệp JSON vào bảng SQL Server

  2. filestream trong máy chủ sql và C # cho aspx

  3. Số lượng giao dịch sau khi THỰC HIỆN chỉ ra rằng câu lệnh GIAO DỊCH COMMIT hoặc ROLLBACK bị thiếu - SQL server 2005

  4. Xoay vòng không có hàm tổng hợp trong MSSQL 2008 R2

  5. SQL được tạo động so với các tham số trong SQL Server