如何不使用游标,通过SQL的GROUP BY子句实现指定数据分组统计
用GROUP BY实现分类-日期维度的价格占比计算
完全可以用带GROUP BY的SQL查询实现,不需要依赖游标,这种写法的执行效率通常远高于游标方案。
两种实现方式:
方式1:使用CTE(公共表表达式)分步计算
先分别统计每日各分类的金额总和、当日全分类总金额,再关联计算占比:
WITH cat_daily_sum AS ( SELECT Category, Date, SUM(Price) AS category_total FROM your_table GROUP BY Category, Date ), daily_total_sum AS ( SELECT Date, SUM(Price) AS daily_total FROM your_table GROUP BY Date ) SELECT c.Category, c.Date, ROUND((c.category_total * 100.0) / d.daily_total, 2) AS Price_Percentage FROM cat_daily_sum c JOIN daily_total_sum d ON c.Date = d.Date ORDER BY c.Date, c.Category;
方式2:使用窗口函数(更简洁)
利用窗口函数直接在分组后计算当日全分类总金额,一步完成:
SELECT Category, Date, ROUND((SUM(Price) * 100.0) / SUM(SUM(Price)) OVER (PARTITION BY Date), 2) AS Price_Percentage FROM your_table GROUP BY Category, Date ORDER BY Date, Category;
关键说明:
- 乘以
100.0是为了避免整数除法导致结果截断(如MySQL、SQL Server等数据库中整数相除会取整) ROUND(..., 2)用于将结果保留两位小数,和示例中的15.38格式匹配- 窗口函数
SUM(SUM(Price)) OVER (PARTITION BY Date)的作用是:在按日期划分的分区内,对所有分类的每日求和结果再次求和,得到当日全分类总金额
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

