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



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

我在甲骨文中的查询是这样的

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,级别 15,状态 1,第 18
行 "1"附近的语法不正确。

我无法弄清楚为什么会出现此错误,所以任何人都可以帮助识别吗?谢谢!

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

此外,在 sql 服务器上,PIVOT 声明中的那些别名是不允许的,就像在 Oracle 上一样。

因此,通过一些修复,PIVOT将在sql服务器上工作。

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) 将在 SCORE 的 PIVOT 中给出 1 或 NULL 。
因此,这也将导致一个充满 0 a 1 的矩阵。

最新更新