CASE表达式总和-加入其他表时出现的问题

问题描述 投票:0回答:1

我在存储过程中有一个case表达式,将一个account字段加起来,然后插入用户ID。逻辑起作用...直到连接到另一个表。

我曾尝试向查询中添加非重复计数和其他表,但是当我加入另一个表时,当我希望该帐户的值为0时,它将应用1值。

这是存储过程中的计算;

INSERT INTO #SUMMARY_TEMP (USER_ID,FSN_CNT )
(SELECT USER_ID,
        SUM(CASE WHEN A_GROUP_CD = 'RED' AND A_TYPE_CD = 'FSN' THEN REC_COUNT ELSE 0 END)
) AS 'FSN_CNT',
FROM (SELECT A_ACCOUNT_NBR,
             A_USER_ID,
             A_GROUP_CD,
             A_TYPE_CD,
             COUNT(*) AS REC_COUNT
      FROM EXCEPTION_DETAIL
           INNER JOIN #STAFF ON A_REPORT_DT = @REPORT_DT 
                            AND (A_USER = B_USER_ID)
      GROUP BY A_ACCOUNT_NBR,
               A_USER_ID_ID,
               A_GROUP_CD,
               A_TYPE_CD) EXCEPTIONS
GROUP BY A_USER_ID,
A_ACCOUNT_NBR)

这是我期望的2个用户ID的结果

A_ACCOUNT_NBR   USER_ID     FSN_CNT 
123456          HENRY       0   
123498          HENRY       1   
374933          JOE         1   
474930          JOE         0   

但是当我连接到另一个表时,数据看起来像

A_ACCOUNT_NBR   USER_ID     FSN_CNT 
123456          HENRY       1   
123498          HENRY       1   
374933          JOE         1   
474930          JOE         1

将值1应用于帐户123456和474930时应为1。我认为是因为另一个表没有ACCOUNT_NBR列-我正在加入USER_ID,因此它将1应用于表A的所有ACCOUNT_NBR

感谢所有建议,我尝试使用CTE,计数现在看起来不错,但是它创建了重复的行,如下所示。关于如何删除重复项的任何建议,以下是我用于CTE的联接;

select cte.*, jt.USER_ID
from cte
join EXCEPTION_DETAIL jt on cte.USER_ID=jt.USER_ID                                                  

USER    ACCOUNT_NBR FSN_CNT
HENRY   123456      0
HENRY   123456      0
HENRY   123498      1
HENRY   123498      1

JOE     374933      1
JOE     374933      1
JOE     474930      0
JOE     474930      0
sql sql-server join sum case
1个回答
0
投票

您可以使用cte分隔第一个查询,并与下一个级别一起加入,如下所示

with cte as
(
(SELECT USER_ID,
        SUM(CASE WHEN A_GROUP_CD = 'RED' AND A_TYPE_CD = 'FSN' THEN REC_COUNT ELSE 0 END)
) AS 'FSN_CNT',
FROM (SELECT A_ACCOUNT_NBR,
             A_USER_ID,
             A_GROUP_CD,
             A_TYPE_CD,
             COUNT(*) AS REC_COUNT
      FROM EXCEPTION_DETAIL
           INNER JOIN #STAFF ON A_REPORT_DT = @REPORT_DT 
                            AND (A_USER = B_USER_ID)
      GROUP BY A_ACCOUNT_NBR,
               A_USER_ID_ID,
               A_GROUP_CD,
               A_TYPE_CD) EXCEPTIONS
GROUP BY A_USER_ID,
A_ACCOUNT_NBR)
) select cte.*,jt.USER_ID from cte join jointable_name jt on cte.USER_ID=jt.USER_ID
© www.soinside.com 2019 - 2024. All rights reserved.