为什么GROUP BY在SQL Server中不起作用?

xqkwcwgp  于 2023-01-25  发布在  SQL Server
关注(0)|答案(4)|浏览(297)

我有以下疑问:

SELECT TOP 500
        BusinessDate,
        BRANCH_CO_MNE,
        RIGHT(TRANS_INPUTTER, 5) 'USER_ID',
        CASE
            WHEN TRANS_TYPE LIKE '%Deposit%'
            THEN COUNT(*)
                END 'No of Cash Deposit'
FROM    test_link.MMBL_phase2.dbo.EB_MMBL_H_UAR_PROT
WHERE   BusinessDate = '2023-01-23'
GROUP BY    BusinessDate,
            BRANCH_CO_MNE,
            TRANS_INPUTTER,
            TRANS_TYPE
ORDER BY    USER_ID

返回以下结果:
| 业务日期|分公司|用户ID|现金存款数|
| - ------|- ------|- ------|- ------|
| 二〇二三年一月二十三日|印度国家银行|小行星10938|零|
| 二〇二三年一月二十三日|印度国家银行|小行星10938|零|
| 二〇二三年一月二十三日|印度国家银行|小行星10938|零|
| 二〇二三年一月二十三日|印度国家银行|小行星10938|零|
| 二〇二三年一月二十三日|印度国家银行|小行星10938|零|
| 二〇二三年一月二十三日|印度国家银行|小行星11748|零|
| 二〇二三年一月二十三日|印度国家银行|小行星11748|零|
| 二〇二三年一月二十三日|印度国家银行|小行星11748|零|
| 二〇二三年一月二十三日|印度国家银行|小行星11748|零|
| 二〇二三年一月二十三日|印度国家银行|小行星11748|零|
| 二〇二三年一月二十三日|印度国家银行|小行星11748|十八|
| 二〇二三年一月二十三日|印度国家银行|小行星11748|零|
当我将No of Cash Deposit放入GROUP BY子句时,NULL值重复。
结果不应该是
| 业务日期|分公司|用户ID|现金存款数|
| - ------|- ------|- ------|- ------|
| 二〇二三年一月二十三日|印度国家银行|小行星10938|零|
| 二〇二三年一月二十三日|印度国家银行|小行星11748|十八|
| 二〇二三年一月二十三日|印度国家银行|小行星11748|零|

i7uaboj4

i7uaboj41#

我怀疑这里的问题是你尝试了条件聚合。对于条件聚合,聚合函数不进入CASE表达式,CASE表达式被放入聚合函数。作为你的方法的结果,你 * 有 * 到GROUP BYTRANS_INPUTTER,因为它没有被聚合。
如果切换到条件聚集,则可以从GROUP BY中删除TRANS_TYPE。此外,还需要将TRANS_INPUTTER上的GROUP BY更改为RIGHT(TRANS_INPUTTER, 5)

SELECT TOP (500)
       BusinessDate,
       BRANCH_CO_MNE,
       RIGHT(TRANS_INPUTTER, 5) AS USER_ID,
       COUNT(CASE WHEN TRANS_TYPE LIKE '%Deposit%' THEN 1 END) AS [No of Cash Deposit]
FROM test_link.MMBL_phase2.dbo.EB_MMBL_H_UAR_PROT
WHERE BusinessDate = '2023-01-23'
GROUP BY BusinessDate,
         BRANCH_CO_MNE,
         RIGHT(TRANS_INPUTTER, 5)
ORDER BY USER_ID;
gblwokeq

gblwokeq2#

您还可以按TRANS_INPUTTER和TRANS_TYPE进行分组。当这些值不同时,即使您没有在SELECT语句中指定它们,也会有这些值对应的行。
然而,由于我们没有测试数据的脚本,我现在无法重现您的问题。

ippsafx7

ippsafx73#

SELECT TOP 500
    BusinessDate,
    BRANCH_CO_MNE,
    RIGHT(TRANS_INPUTTER, 5) 'USER_ID',
    CASE
        WHEN TRANS_TYPE LIKE '%Deposit%'
        THEN COUNT(*)
            END 'No of Cash Deposit'
FROM    test_link.MMBL_phase2.dbo.EB_MMBL_H_UAR_PROT
WHERE   BusinessDate = '2023-01-23'
GROUP BY    BusinessDate,
        BRANCH_CO_MNE,
        RIGHT(TRANS_INPUTTER, 5),
    CASE
        WHEN TRANS_TYPE LIKE '%Deposit%'
        THEN COUNT(*)
            END 
ORDER BY    USER_ID
zqry0prt

zqry0prt4#

尝试输出TRANS_TYPE,或者将TRANS_TYPE LIKE '%Deposit%'放在WHERE子句中。我认为这些“extras”输出是其他TRANS_TYPE

相关问题