无效标识符:sql 中多列的总和

问题描述

我正在尝试计算此查询中的多列

     SELECT
         SUM (CASE WHEN B.ID = 1 THEN 1 END)     AS OPD,SUM (CASE WHEN B.ID = 2 THEN 1 END)     AS IPD,SUM (CASE WHEN B.ID = 3 THEN 1 END)     AS DC,SUM (CASE WHEN B.ID = 4 THEN 1 END)     AS PROC,SUM (CASE WHEN B.ID = 5 THEN 1 END)     AS SUR,(OPD + IPD + PROC) as Total
    FROM REF_TB_APP_TRANSACTIONS A,REF_VW_VISIT_TYPE      B
        
   WHERE     A.REQ_VISIT_TYPE = B.ID
         AND A.TO_EST_CODE = 20068;

但我收到此错误 PROC invalid identifier

解决方法

您不能直接在 SUMSTotal 列中添加三个 SELECT,因为您使用的是这些列的别名。你可以用另一个 Total 来做你的 SUM CASE 列。

SELECT
    SUM (CASE WHEN B.ID = 1 THEN 1 END)     AS OPD,SUM (CASE WHEN B.ID = 2 THEN 1 END)     AS IPD,SUM (CASE WHEN B.ID = 3 THEN 1 END)     AS DC,SUM (CASE WHEN B.ID = 4 THEN 1 END)     AS [PROC],SUM (CASE WHEN B.ID = 5 THEN 1 END)     AS SUR,SUM (CASE WHEN B.ID IN (1,2,4)THEN 1 END)     AS Total
FROM REF_TB_APP_TRANSACTIONS A,REF_VW_VISIT_TYPE      B
WHERE     A.REQ_VISIT_TYPE = B.ID
        AND A.TO_EST_CODE = 20068;
,

取决于您使用的 DBMS。您不能对这样别名的列求和,您必须使用子选择并从那里进行求和。如果您验证您的 DBMS,我们可以创建查询。

如果是 MS SQL,下面的就可以了。一些事情:

PROC 是保留字,所以要么改变它,要么在它周围加上括号(我选择了括号)。此外,如果您使用 JOINS 与您查询的方式相比,则更可取。

SELECT OPD,IPD,DC,[PROC],SUR,(OPD + IPD + [PROC]) as Total
FROM (
    SELECT
    SUM (CASE WHEN B.ID = 1 THEN 1 END)     AS OPD,SUM (CASE WHEN B.ID = 5 THEN 1 END)     AS SUR
    FROM REF_TB_APP_TRANSACTIONS A
    INNER JOIN REF_VW_VISIT_TYPE B ON A.REQ_VISIT_TYPE = B.ID
    WHERE A.TO_EST_CODE = 20068
) SUB
,

您不能将别名列作为 select 的一部分引用,因为按照查询执行的顺序,它们尚不存在。

您只需将查询包装起来,使其成为 derived table,然后您可以在外部 select 中引用它们,请参阅:

select OPD,OPD + IPD + [PROC] as Total from (
    SELECT
        SUM (CASE WHEN B.ID = 1 THEN 1 END) AS OPD,SUM (CASE WHEN B.ID = 2 THEN 1 END) AS IPD,SUM (CASE WHEN B.ID = 3 THEN 1 END) AS DC,SUM (CASE WHEN B.ID = 4 THEN 1 END) AS [PROC],SUM (CASE WHEN B.ID = 5 THEN 1 END) AS SUR
    FROM REF_TB_APP_TRANSACTIONS A
    join REF_VW_VISIT_TYPE B on B.ID=A.REQ_VISIT_TYPE
    where A.TO_EST_CODE = 20068
)x

猜测是因为你有一个分号,这是 SQLServer,在这种情况下,你需要在保留字 [] 周围使用 PROC

我也正确地 joined 你的表,因为它不再是 1989 年了 :-0