如何在无子查询的SQL分组查询中提取指定值并聚合?
问题描述
现有STORE表,结构包含fruit、color、stock字段,数据如下:
| fruit | color | stock |
|---|---|---|
| apple | red | 30 |
| apple | green | 5 |
| banana | yellow | 40 |
| berry | red | 5 |
| pear | green | 5 |
需要执行SQL语句:SELECT SUM(stock), [?] FROM store GROUP BY fruit,其中[?]需提取指定具体值(例如RED),同时apple对应的SUM(stock)需得到35(即该水果所有库存的总和),期望结果如下:
| Column A | Column B |
|---|---|
| 35 | red |
询问能否无需子查询实现该需求,曾尝试使用STRING_AGG函数,但认为并非最优方案。
解决方案
可以不用子查询实现,核心用条件聚合函数就能精准满足需求,比STRING_AGG更高效直接:
方法:MAX(CASE WHEN ...) 条件取值
这个逻辑是:按水果分组后,仅当该水果存在指定颜色(比如red)时,返回该颜色值;同时计算该水果的总库存。如果不需要所有水果的结果,还可以加WHERE过滤目标水果:
SELECT SUM(stock) AS "Column A", MAX(CASE WHEN color = 'red' THEN color END) AS "Column B" FROM store GROUP BY fruit -- 可选:仅获取apple的结果时添加 WHERE fruit = 'apple';
针对apple的执行结果完全符合预期:
| Column A | Column B |
|---|---|
| 35 | red |
为什么比STRING_AGG更优?
STRING_AGG会把该水果的所有颜色拼接成字符串(比如apple会得到red,green),需要额外处理才能提取指定颜色,逻辑冗余且效率更低。- 条件聚合直接精准匹配目标颜色,计算逻辑简单,执行效率更高,完全贴合需求。
内容的提问来源于stack exchange,提问作者Adrian Tari
相关产品推荐
相关产品推荐

