如何结合CASE、CONTAINS与数组聚合编写SQL查询
解决CASE语句结合聚合函数的分组报错问题
问题分析
你原查询的报错核心是:CASE分支里直接引用了未聚合的project_name字段,同时SET_AGG属于聚合函数,不能出现在GROUP BY子句中。仅按title、owner分组时,未聚合的project_name既不在GROUP BY列表,也没被聚合函数包裹,违反SQL分组规则;若尝试把CASE加入GROUP BY,又因包含聚合函数而不被允许。
正确查询写法
先通过聚合函数获取分组后的必要信息,再在CASE逻辑中使用这些聚合结果或条件聚合字段:
SELECT title, owner, CASE WHEN BOOL_OR(team_id = 1234) THEN MAX(CASE WHEN team_id = 1234 THEN project_name END) ELSE ARRAY_JOIN(SET_AGG(project_name), ' ') END AS project_name FROM actions GROUP BY title, owner
代码解释
BOOL_OR(team_id = 1234):判断当前分组(title+owner维度)下是否存在team_id=1234的记录,替代原写法中存在参数顺序问题的CONTAINS(SET_AGG(team_id), 1234)。MAX(CASE WHEN team_id = 1234 THEN project_name END):当分组内存在1234团队时,取出对应project_name(若有多条1234团队的记录,MAX会取其中一个,匹配示例需求)。ARRAY_JOIN(SET_AGG(project_name), ' '):当分组内无1234团队时,将所有project_name去重后拼接成字符串(无需去重则替换为ARRAY_AGG)。
验证结果
用你提供的示例数据执行上述查询,将得到期望结果:
| title | owner | project_name |
|---|---|---|
| test1 | owner1 | ProjectA |
| test2 | owner1 | ProjectB |
| test3 | owner2 | ProjectD ProjectE |
内容的提问来源于stack exchange,提问作者BigPanda
相关产品推荐
相关产品推荐

