Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Pivots z dynamicznymi kolumnami w SQL Server

Dodanie tych kolumn jest bardzo proste. Ostatnie zapytanie to

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 

który ma t2.AccountName dodany do podzapytania, a konto i AccountName dodane do początkowego SELECT. Wrzuć je do instrukcji budowania i gotowe:

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 ' 

Jeśli chodzi o wstrzykiwanie SQL, jedynym sposobem, w jaki mogę to zobaczyć, jest osadzenie złośliwego kodu w tabeli Table1.Col_Name i jeśli musisz się tym martwić, masz większe problemy niż „zablokowanie” tego dynamicznego zapytania.

Warto również wspomnieć, że użyłbym poniższego do zbudowania listy kolumn (@Cols), ponieważ jest krótsza i łatwiejsza do odczytania, ale głównie dlatego, że nie lubię 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. Entity Framework 4 Code First — zapobieganie upuszczaniu/utworzeniu bazy danych

  2. pyodbc.connect() działa, ale nie sqlalchemy.create_engine().connect()

  3. BCP - Nieprawidłowa wartość znaku dla specyfikacji rzutowania podczas importu do tabeli z kolumną IDENTITY

  4. Jak znaleźć login, nazwę użytkownika bazy danych lub role użytkownika domeny sqlserver, który nie ma własnego loginu?

  5. Utwórz harmonogram agentów SQL Server za pomocą T-SQL