sql - 在 GROUP BY 子句中使用 EXISTS

标签 sql sql-server tsql select

是否可以执行以下操作:
我有一个看起来像这样的表:

declare @tran_TABLE TABLE(
EOMONTH DATE,
AccountNumber INT,
CLASSIFICATION_NAME VARCHAR(50),
Value Float

)

INSERT INTO @tran_TABLE VALUES('2018-11-30','123','cat1',10)
INSERT INTO @tran_TABLE VALUES('2018-11-30','123','cat1',15)
INSERT INTO @tran_TABLE VALUES('2018-11-30','123','cat1',5 )
INSERT INTO @tran_TABLE VALUES('2018-11-30','123','cat2',10)
INSERT INTO @tran_TABLE VALUES('2018-11-30','123','cat3',12)
INSERT INTO @tran_TABLE VALUES('2019-01-31','123','cat1',5 )
INSERT INTO @tran_TABLE VALUES('2019-01-31','123','cat2',10)
INSERT INTO @tran_TABLE VALUES('2019-01-31','123','cat2',15)
INSERT INTO @tran_TABLE VALUES('2019-01-31','123','cat3',5 )
INSERT INTO @tran_TABLE VALUES('2019-01-31','123','cat3',2 )
INSERT INTO @tran_TABLE VALUES('2019-03-31','123','cat1',15)


EOMONTH     AccountNumber   CLASSIFICATION_NAME     Value
2018-11-30  123                     cat1                10
2018-11-30  123                     cat1                15
2018-11-30  123                     cat1                5
2018-11-30  123                     cat2                10
2018-11-30  123                     cat3                12
2019-01-31  123                     cat1                5
2019-01-31  123                     cat2                10
2019-01-31  123                     cat2                15
2019-01-31  123                     cat3                5
2019-01-31  123                     cat3                2
2019-03-31  123                     cat1                15

我想生成一个结果,它将检查每个月中的每个 AccountNumber(本例中只有一个)是否存在 CLASSIFICATION_NAME cat1、cat2、cat3。
如果该月所有 3 个都存在,则返回 1,但如果缺少任何一个,则返回 0。

结果应如下所示:

EOMONTH     AccountNumber   CLASSIFICATION_NAME
2018-11-30    123                   1                               
2019-01-31    123                   1                       
2019-03-31    123                   0   

但我希望尽可能紧凑地完成此操作,而不是首先创建一个按 CLASSIFICATION_NAME、EOMONTH 和 AccountNumber 对所有内容进行分组的表,然后从该表中进行选择。
例如,在下面的伪代码中,是否可以使用 EXISTS 语句进行分组依据?

SELECT 
    EOMONTH
    ,AccountNumber
    ,CASE WHEN EXISTS (CLASSIFICATION_NAME = 'cat1' AND 'cat2' AND 'cat3') THEN 1 ELSE 0 end 
    ,SUM(Value) AS totalSpend
FROM @tran_TABLE
GROUP BY 
    EOMONTH
    ,AccountNumber

最佳答案

您可以通过计算满足此条件的不同分类(每组)来模拟此行为:

SELECT 
    EOMONTH
    ,AccountNumber
    ,CASE COUNT(DISTINCT CASE WHEN classification_name IN ('cat1', 'cat2', 'cat3') THEN classification_name END) 
          WHEN 3 THEN 1 
          ELSE 0 
     END
    ,SUM(Value) AS totalSpend
FROM @tran_TABLE
GROUP BY 
    EOMONTH
    ,AccountNumber

关于sql - 在 GROUP BY 子句中使用 EXISTS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56163854/

相关文章:

java - 如何使用 Join 定义 JPA 存储库查询?

sql - 删除oracle sql中的换行符

php - 如何使用 PHP、SQL SERVER 2005 从 INSERT 语句返回插入的行?

sql-server - SQL 服务器 : How to use XPATH in select query

sql - '-' 附近的语法不正确,使用来自 LoginUserRolePermission.zip 的脚本

sql - 如何改进此邮寄地址 SQL Server SELECT 语句?

mysql - 每 24 小时安排一次 MySQL 查询;查询表并将结果存储在另一个表中

sql - 多次提供相同的主键值时获取唯一的搜索数据

sql-server - 连接字符串并合并

mysql - 尝试将年份与大学生联系起来