Konvertieren von Access TRANSFORM / PIVOT-Abfrage zu SQL server

TRANSFORM Avg(CASE WHEN [temp].[sumUnits] > 0 THEN [temp].[SumAvgRent] / [temp].[sumUnits] ELSE 0 END) AS Expr1 SELECT [temp].[Description] FROM [temp] GROUP BY [temp].[Description] PIVOT [temp].[Period]; 

Sie müssen diese Abfrage für SQL server umwandeln

Ich habe alle anderen Beiträge gelesen, aber nicht in der Lage, diese in die gleiche umzuwandeln

Hier ist die gleichwertige Version mit dem PIVOT :

 SELECT * FROM ( SELECT CASE WHEN sumUnits > 0 THEN SumAvgRent / sumUnits ELSE 0 END AS Expr1, Description, Period FROM temp ) t PIVOT ( AVG(Expr1) FOR Period IN(Period1, Period2, Period3) ) p; 

SQL Fiddle Demo

Zum Beispiel wird das Ihnen geben:

 | DESCRIPTION | PERIOD1 | PERIOD2 | PERIOD3 | --------------------------------------------- | D1 | 10 | 0 | 20 | | D2 | 100 | 1000 | 0 | | D3 | 50 | 10 | 2 | 

Beachten Sie, dass Sie bei der Verwendung des MS SQL server PIVOT Tabellenbetreibers die Werte für die verschwenkte Spalte eingeben müssen. Allerdings, IN MS Access, Dies war die Arbeit, die TRANSFORM mit PIVOT tun, die die Werte der TRANSFORM dynamisch erhält. In diesem Fall musst du das dynamisch mit dem PIVOT Betreiber machen, so:

 DECLARE @cols AS NVARCHAR(MAX); DECLARE @query AS NVARCHAR(MAX); SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(Period) FROM temp FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,''); SET @query = ' SELECT Description, ' + @cols + ' FROM ( SELECT CASE WHEN sumUnits > 0 THEN SumAvgRent / sumUnits ELSE 0 END AS Expr1, Description, Period FROM temp ) t PIVOT ( AVG(Expr1) FOR Period IN( ' + @cols + ') ) p '; Execute(@query); 

Aktualisierte SQL Fiddle Demo

Dies sollte Ihnen das gleiche Ergebnis geben:

 | DESCRIPTION | PERIOD1 | PERIOD2 | PERIOD3 | --------------------------------------------- | D1 | 10 | 0 | 20 | | D2 | 100 | 1000 | 0 | | D3 | 50 | 10 | 2 | 
 TRANSFORM SUM(s2+s1) SELECT PlanoContas.Conta AS Conta, SPACE(LEN(PlanoContas.Conta)/2) + PlanoContas.Extenso AS Extenso, PlanoContas.Tipo,SUM(s2+s1) AS [01/04/14] FROM PlanoContas INNER JOIN TEMP ON PlanoContas.Conta=LEFT(Temp.Conta,LEN(PlanoContas.Conta)) WHERE LEN(PlanoContas.Conta)<=16 AND (s1<>0 OR s2<>0) GROUP BY PlanoContas.Conta,Extenso,Tipo ORDER BY PlanoContas.Conta PIVOT Filial