求SQL查询语句:按Category统计TotalSales并展示多列及占比
按Category统计销售额并计算占比的SQL实现
原表数据(Orders$)
| Category | Sub-Cate | Sales |
|---|---|---|
| Chairs | Paper | 16.448 |
| Suppliers | Binders | 3.54 |
| Chairs | Art | 85 |
| Suppliers | Binders | 45.89 |
| Furniture | Paper | 75.235 |
需求
按Category列统计该分类的总销售额(TotalSales),同时输出每条记录的Sub-Cate、Sales、对应分类的TotalSales,以及该条记录销售额占分类总销售额的比例(Percentage = Sales / 对应Category的TotalSales)。
原尝试的SQL语句
select Category,sales,TotalSales from ( select Category,Sales, case when Category='Office Supplies' then sum(sales) when Category='Furniture' then sum(sales) end as TotalSales from Orders$ group by Category,Sales ) as tmp order by Category desc
期望查询结果
| Category | Sub-Cate | Sales | TotalSales | Percentage |
|---|---|---|---|---|
| Chairs | Paper | 16.448 | 101.448 | % |
| Suppliers | Binders | 3.54 | 49.43 | % |
| Chairs | Art | 85 | 101.448 | % |
| Suppliers | Binders | 45.89 | 49.43 | % |
| Furniture | Paper | 75.235 | 75.235 | % |
正确的SQL语句
使用窗口函数SUM() OVER(PARTITION BY Category)可以直接计算每个分类的总销售额,无需复杂的子查询或分组关联,语句如下:
SELECT Category, `Sub-Cate`, Sales, SUM(Sales) OVER(PARTITION BY Category) AS TotalSales, -- 格式化百分比,保留两位小数并添加%符号,可按需调整精度 CONCAT(ROUND((Sales / SUM(Sales) OVER(PARTITION BY Category)) * 100, 2), '%') AS Percentage FROM Orders$ ORDER BY Category DESC;
说明
SUM(Sales) OVER(PARTITION BY Category):窗口函数会为每条记录计算其所属Category的总销售额,无需对原数据分组聚合,保留所有原始记录的同时得到分类总计。- 占比计算:用单条记录的Sales除以对应分类的TotalSales,乘以100后保留两位小数并拼接%符号,得到直观的百分比展示。
内容的提问来源于stack exchange,提问作者Harish Kumar
相关产品推荐
相关产品推荐

