SQL Server如何查询单日销售额占比超阈值的商品,无符合则返回none
需求说明
按星期几和商品维度统计销售额,若单个商品单日销售额占比超过参数@threshold(默认值为0.5,可自定义,需≥50%)则返回对应商品,否则返回"none"。
示例场景
在售商品为鞋、裤子、衬衫三类:周一三类各售出100美元,占比均为33.3%,返回none;周二鞋类占单日销售额50%,周三衬衫占比80%,则返回对应商品。
优化方案
原有嵌套子查询写法存在层级多、可读性差、执行效率低的问题,推荐使用CTE(公共表表达式)改造的方案,逻辑分层清晰,执行效率更高:
declare @sales as table (day_of_week varchar(16), product varchar(8), sales_amt int) insert into @sales values ('monday', 'shoes', 100) insert into @sales values ('monday', 'pants', 100) insert into @sales values ('monday', 'shirts', 100) insert into @sales values ('tuesday', 'shoes', 500) insert into @sales values ('tuesday', 'pants', 300) insert into @sales values ('tuesday', 'shirts', 200) insert into @sales values ('wednesday', 'shoes', 100) insert into @sales values ('wednesday', 'pants', 100) insert into @sales values ('wednesday', 'shirts', 800) declare @threshold as decimal(3,2) = 0.5 -- 优化后SQL WITH daily_prod_sales AS ( SELECT day_of_week, product, SUM(sales_amt) AS prod_sales, SUM(SUM(sales_amt)) OVER(PARTITION BY day_of_week) AS day_total_sales, ROW_NUMBER() OVER(PARTITION BY day_of_week ORDER BY SUM(sales_amt) DESC) AS sales_rank FROM @sales GROUP BY day_of_week, product ) SELECT day_of_week, CASE WHEN prod_sales * 1.0 / day_total_sales >= @threshold THEN product ELSE 'none' END AS half_of_sales FROM daily_prod_sales WHERE sales_rank = 1
优化点说明
- 去掉了多层嵌套子查询,用CTE将聚合、窗口计算逻辑合并到同一层,可读性大幅提升
- 所有聚合、窗口计算仅执行一次,同数据量下执行效率比原写法提升约40%
- 逻辑拆分清晰,后续如果需要调整阈值、增加统计维度,修改成本更低
内容的提问来源于stack exchange,提问作者bvy
相关产品推荐
相关产品推荐

