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];
需要将此查询转换为SQL Server
我已经阅读了所有其他帖子,但无法将其转换为相同的帖子
这是使用PIVOT表运算符的等效版本:
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;
例如,这将为您提供:
| DESCRIPTION | PERIOD1 | PERIOD2 | PERIOD3 | --------------------------------------------- | D1 | 10 | 0 | 20 | | D2 | 100 | 1000 | 0 | | D3 | 50 | 10 | 2 |
请注意, 使用MS SQL ServerPIVOT表运算符时,必须输入数据透视列的值。然而,在MS Access,这是该作品是TRANSFORM用PIVOT做的,这是动态获取枢转列的值。在这种情况下,您必须与PIVOT操作员一起动态地执行此操作,如下所示:
TRANSFORM
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);
这应该给您相同的结果: