如何对SQL中新建的计算列执行聚合等查询操作?
问题解决方法
你遇到的问题是SQL执行顺序导致的:SELECT子句里定义的别名(比如这里的sample),在同层级的聚合函数中无法直接引用——因为SQL会先执行FROM、WHERE,再处理SELECT里的字段计算,最后才处理聚合函数,所以当SUM想引用sample时,这个别名还没被解析出来。另外你的原SQL还缺少GROUP BY子句,直接同时查询非聚合字段和聚合函数会报错,以下是几种可行的解决办法:
方法1:直接在SUM中嵌入CASE逻辑
把生成sample的CASE语句直接放到SUM函数里,同时加上GROUP BY来匹配非聚合的full_name字段:
select full_name, case when full_name like '%b%' then 1 else 0 end as sample, sum(case when full_name like '%b%' then 1 else 0 end) as total_sample from table group by full_name
方法2:用子查询/CTE先计算sample列
先通过子查询或公共表表达式(CTE)生成包含sample列的临时结果集,再在外层对sample做聚合:
子查询写法
select full_name, sample, sum(sample) over() as total_sample -- 全局总和,按分组统计的话加PARTITION BY full_name from ( select full_name, case when full_name like '%b%' then 1 else 0 end as sample from table ) t
CTE写法
with temp_data as ( select full_name, case when full_name like '%b%' then 1 else 0 end as sample from table ) select full_name, sample, sum(sample) over() as total_sample from temp_data
如果需要按full_name分组统计每个名字对应的sample总和,在外层加上GROUP BY即可:
select full_name, max(sample) as sample, -- 每个full_name对应的sample是固定值,用max/min都能取出该值 sum(sample) as total_sample from ( select full_name, case when full_name like '%b%' then 1 else 0 end as sample from table ) t group by full_name
内容的提问来源于stack exchange,提问作者Void S
相关产品推荐
相关产品推荐

