dynamisches Pivot in sql

Ich habe eine folgende sql Abfrage mit Pivot-function. Ich weiß nicht, welchen Fehler ich habe

diese Abfrage. Bitte helfen Sie mir einfach aus diesem

 DECLARE @DEPT VARCHAR(MAX) SELECT @DEPT=COALESCE('@DEPT+','['+DEPTID+']','['+DEPTID+']) FROM DEPARTMENTDEMO DECLARE @QUERY VARCHAR(MAX) SET @QUERY='SELECT '+@DEPT+' FROM (SELECT DEPTID FROM DEPARTMENTDEMO )AS SOURCETABLE PIVOT (DEPTNAME FOR DEPTID IN ('+@DEPT+') )AS PIVOTTABLE' EXEC SP_EXECUTESQL @QUERY 

   

Zuerst hat der Ausdruck, der für die Erstellung der Spaltenliste verwendet wird, einige Anführungszeichen an falschen Stellen:

 SELECT @DEPT=COALESCE(@DEPT+',['+DEPTID+']','['+DEPTID+']') 

Auch casting Sie einen Blick hier für einen richtigen path, um die Spaltenliste zu erstellen (es ist unterstützt Syntax und die Reihenfolge der Elemente ist garantiert).

Für den eigentlichen PIVOT-Ausdruck muss man in der Spalte eine Aggregation verwenden. Versuche mit MAX:

 SET @QUERY= ' SELECT '+@DEPT+' FROM ( SELECT DEPTID, DEPTNAME FROM DEPARTMENTDEMO ) AS SOURCETABLE PIVOT ( MAX(DEPTNAME) FOR DEPTID IN ('+@DEPT+') ) AS PIVOTTABLE' 

Ich habe gerade mit dem dynamischen Schwenken am anderen Tag gespielt! Hier ist ein voll funktionsfähiges Test-Skript, das ich erstellt habe. Obwohl es auf einem CROSS JOIN Beispiel basiert, sollte es einige nützliche Einsicht enthalten. Ich hoffe, Sie können einige Ideen darüber, wie Sie Ihre gewünschten Ergebnisse zu bekommen.

 IF OBJECT_ID(N'dbo.Strikes','U') IS NOT NULL DROP TABLE dbo.Strikes; CREATE TABLE dbo.Strikes( Dimension nvarchar(10) NOT NULL PRIMARY KEY , DimVal smallint DEFAULT 0); INSERT INTO dbo.Strikes (Dimension, DimVal) VALUES (N'Fire',5), (N'Water',4), (N'Earth',3), (N'Air',2), (N'Spirit',1), (N'George',0); /* Dynamic Pivot Exmple */ --declare variables and cursor DECLARE @PvtClm varchar(MAX) DECLARE @PTmp AS varchar(10) DECLARE PvtCsr CURSOR FOR SELECT DISTINCT Dimension FROM dbo.Strikes ORDER BY Dimension --open and fill pivot column string OPEN PvtCsr SET @PvtClm = N'[' FETCH NEXT FROM PvtCsr INTO @PTmp WHILE @@FETCH_STATUS = 0 BEGIN SET @PvtClm = @PvtClm + RTRIM(@PTmp) + N'], [' FETCH NEXT FROM PvtCsr INTO @PTmp END --kill cursor and finish pivot string CLOSE PvtCsr DEALLOCATE PvtCsr --strip bogus end characters to finish pivot string SET @PvtClm = LEFT(@PvtClm,(LEN(@PvtClm)-3)); --PRINT @PvtClm --set the dynamic pivot sql string DECLARE @DynPivot nvarchar(MAX) SET @DynPivot = N' WITH CrJoin AS ( SELECT S1.Dimension AS SourceElement, S2.Dimension AS TargetElement, S1.DimVal - S2.DimVal AS Modifier FROM dbo.Strikes AS S1 CROSS JOIN dbo.Strikes AS S2) SELECT SourceElement, ' + @PvtClm + ' FROM CrJoin PIVOT( MAX(CrJoin.Modifier) FOR CrJoin.TargetElement IN(' + @PvtClm + ') ) AS PvT;' --PRINT @DynPivot --run the pivot EXEC sp_executesql @stmt = @DynPivot; IF OBJECT_ID(N'dbo.Strikes','U') IS NOT NULL DROP TABLE dbo.Strikes;