Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Pivots с динамични колони в SQL Server

Добавянето на тези колони е много лесно. Последната заявка ще бъде

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 

който има t2.AccountName, добавен към подзаявката, и Account и AccountName, добавени към първоначалния SELECT. Хвърлете ги в израза за изграждане и сте готови:

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 ' 

Що се отнася до SQL инжектирането, единственият начин, по който виждам това да се случва, е ако някой по някакъв начин вгради зловреден код в Table1.Col_Name и ако трябва да се тревожите за това, имате по-големи проблеми от „заключването“ на тази динамична заявка.

Също така си струва да се спомене, че бих използвал следното, за да съставя списъка с колони (@Cols), защото е по-кратък и по-лесен за четене, но най-вече защото не харесвам 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. T-SQL Изтрива всички редове от таблица, когато подзаявката е неправилно формирана

  2. Как да проверя дали обектът DateTime не е присвоен?

  3. Подреждане по низходяща дата - месец, ден и година

  4. Представяне на DateTime в милисекунди?

  5. Неуспешно влизане за потребител (Microsoft SQL Server, грешка:18456) SQL Server 2005