将Access TRANSFORM/PIVOT查询转换为SQL Server

19
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 的查询。

我已经阅读了所有其他帖子,但是无法将其转换成相同的查询。


请问您能否解释一下,您想用一些示例数据和期望的输出来做什么? - Mahmoud Gamal
@MahmoudGamal:不知道,只是在MS Access中编写了一些查询。我们需要将程序转换为使用SQL Server 2005的PHP应用程序! - Vipin Jain
1个回答

22

以下是使用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演示

例如,这将为您提供:

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

请注意:当使用 MS SQL Server 的 PIVOT 表运算符时,您需要输入旋转列的值。但是,在 MS Access 中,该工作由带有 PIVOTTRANSFORM 完成,它可以动态获取旋转列的值。在这种情况下,您需要使用 PIVOT 运算符进行动态操作,如下所示:

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);

SQL Fiddle演示更新

这将给你相同的结果:

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

谢谢回复,现在我清楚地知道该如何处理这个查询了。让我做同样的事情并检查它是否能够正常工作 :) - Vipin Jain
谢谢你,Mahmoud。你会如何将这个写成一个CREATE VIEW语句? - Kopernik
1
据我所知,由于动态SQL的原因,您无法将此写入视图或UDF中,但是您可以在存储过程中执行它,这样可以正常工作。 - Mahmoud Gamal
只是一个微小的更新,不使用 XML:SQL fiddle - Jinxed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接