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

Pivots có cột động trong SQL Server

Việc thêm các cột đó rất đơn giản. Truy vấn cuối cùng sẽ là

SELECT Account, AccountName, [Feb-11],[Jan-11],[Mar-11]   FROM   
(SELECT
t1.Col_Name,
t2.Account,
t2.AccountName,
t2.Amount
FROM Table1 AS t1
JOIN Table2 AS t2 ON t1.Col_ID1 = t2.Col_ID2
) p
PIVOT
(
Sum ([Amount] )
FOR Col_Name IN
( [Feb-11],[Jan-11],[Mar-11] )
) AS pvt 

trong đó có t2.AccountName được thêm vào truy vấn con và Account và AccountName được thêm vào SELECT ban đầu. Quăng chúng vào câu lệnh xây dựng và bạn đã hoàn tất:

DECLARE @query NVARCHAR(4000)
SET @query = N'SELECT Account, AccountName, ' +    @cols +'   FROM   

(SELECT
t1.Col_Name,
t2.Account,
t2.AccountName,
t2.Amount
FROM Table1 AS t1
JOIN Table2 AS t2 ON t1.Col_ID1 = t2.Col_ID2
) p

PIVOT
(
Sum ([Amount] )
FOR Col_Name IN
( '+
@cols +' )
) AS pvt ' 

Đối với SQL injection, cách duy nhất tôi có thể thấy điều đó đang xảy ra là nếu ai đó bằng cách nào đó nhúng mã độc hại vào trong Table1.Col_Name và nếu bạn phải lo lắng về điều đó, bạn gặp vấn đề lớn hơn là "khóa" truy vấn động này.

Cũng đáng nói hơn, tôi muốn sử dụng phần sau để xây dựng danh sách các cột (@Cols) vì nó ngắn hơn và dễ đọc hơn, nhưng chủ yếu là vì tôi không thích XML.

DECLARE @cols NVARCHAR(2000)    
SELECT @cols = isnull(@cols + ',', '') + '[' + Col_Name + ']'
 FROM Table1
 ORDER BY Col_Name


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. So sánh các ngày được lưu trữ dưới dạng varchar

  2. Tập lệnh để lưu dữ liệu varbinary vào đĩa

  3. Không thể tạo kết nối cho màn hình từ xa cho ứng dụng C #

  4. Cài đặt phiên bản cụm chuyển đổi dự phòng SQL Server - Phần 1

  5. Lập bản đồ điểm không gian địa lý trong Fluent NHibernate