目前我正在将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”附近的语法不正确。
我无法弄清楚为什么这个错误,所以任何人都可以帮助识别?非常感谢你!
答案 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。