将查询PIVOT从Oracle转换为SQL Server错误

时间:2016-07-12 16:16:10

标签: sql sql-server oracle pivot

目前我正在将Oracle触发器转换为SQL Server,但我遇到了一个问题。

我在Oracle中的查询就像这样

SELECT 
    CUSTOMER_ID, NVL(MATRIX1,0) MATRIX1, NVL(MATRIX2,0) MATRIX2
FROM 
    (SELECT DISTINCT 
         CUSTOMER_ID, SCORE 
     FROM STABLE) A
PIVOT (SUM(1) AS SCORE_MATRIX FOR (SCORE) IN (
                                              1 AS IND_1, 2 AS IND_2));

我在SQL Server中的T-SQL查询看起来像这样

SELECT 
    CUSTOMER_ID, ISNULL(MATRIX1,0) AS MATRIX1, ISNULL(MATRIX2,0) AS MATRIX2
FROM 
    (SELECT DISTINCT 
         CUSTOMER_ID, SCORE 
     FROM STABLE) A
PIVOT (SUM(1) AS SCORE_MATRIX FOR (SCORE) IN (
                                              1 AS IND_1, 2 AS IND_2)) PVT;

但是我收到错误:

  

Msg 102,Level 15,State 1,Line 18
  “1”附近的语法不正确。

我无法弄清楚为什么这个错误,所以任何人都可以帮助识别?非常感谢你!

1 个答案:

答案 0 :(得分:1)

错误来自SUM(1)。 由于1不是源查询A中的列。

此外,在sql-server上,不允许在Oracle上使用PIVOT声明中的别名。

因此,通过一些修复,PIVOT将在sql-server上运行。

SELECT 
    CUSTOMER_ID, ISNULL([1],0) AS MATRIX1, ISNULL([2],0) AS MATRIX2
FROM 
    (SELECT DISTINCT CUSTOMER_ID, SCORE FROM STABLE) AS A
PIVOT (
    COUNT(SCORE) FOR SCORE IN ([1], [2])
) AS PVT;

注意:

SUM(1)被COUNT(SCORE)取代 并且COUNT(SCORE)将在该PIVOT中为SCORE提供1或NULL 所以这也会导致矩阵填充0 a 1。