如何编写SQL Server存储过程 在按城市统计的月度手机销量总和行下方加行
以下是符合需求的SQL Server存储过程实现,可直接生成带城市维度汇总行的查询结果,汇总行自动紧跟在对应城市的明细之后:
实现逻辑说明
用SQL Server内置的ROLLUP分组运算符,既能保留所有原始明细行,又只会生成城市级的汇总行,不会额外生成其他维度的多余汇总,通过排序规则控制汇总行的展示位置。
存储过程代码
CREATE PROCEDURE GetCityMonthlyPhoneStat AS BEGIN -- 关闭行数计数提示,避免影响应用程序接收结果 SET NOCOUNT ON; SELECT country, city, -- 汇总行特殊标记,可根据需求自定义显示内容 CASE WHEN GROUPING(store) = 1 THEN N'城市合计' ELSE store END AS store, CASE WHEN GROUPING(phonetype) = 1 THEN N'' ELSE phonetype END AS phonetype, CASE WHEN GROUPING(phonename) = 1 THEN N'' ELSE phonename END AS phonename, SUM([month(no.of phones)]) AS [month(no.of phones)] FROM -- 替换为你实际的业务表名 your_table_name GROUP BY country, city, -- 括号包裹的字段不拆分分组,仅生成「国家+城市」级别的汇总,不会产生多余汇总行 ROLLUP((store, phonetype, phonename)) ORDER BY country, city, -- 同一城市下明细行在前,汇总行在后 GROUPING(store), store, phonetype, phonename END GO
调用方式
执行存储过程即可得到结果:
EXEC GetCityMonthlyPhoneStat
输出效果示例
针对你提供的测试数据,运行后输出如下:
| country | city | store | phonetype | phonename | month(no.of phones) |
|---|---|---|---|---|---|
| India | bangalore | reliance | android | oneplus | 22 |
| India | bangalore | reliance | android | vivo | 167 |
| India | bangalore | reliance | android | redmi | 106 |
| India | bangalore | 城市合计 | 295 | ||
| India | Hyderabad | BigC | android | oppo | 223 |
| India | Hyderabad | BigC | android | vivo | 55 |
| India | Hyderabad | 城市合计 | 278 |
可选扩展(带月份筛选参数)
如果需要指定查询月份,可调整存储过程增加入参:
CREATE PROCEDURE GetCityMonthlyPhoneStat @query_year INT, @query_month INT AS BEGIN SET NOCOUNT ON; SELECT country, city, CASE WHEN GROUPING(store) = 1 THEN N'城市合计' ELSE store END AS store, CASE WHEN GROUPING(phonetype) = 1 THEN N'' ELSE phonetype END AS phonetype, CASE WHEN GROUPING(phonename) = 1 THEN N'' ELSE phonename END AS phonename, SUM([month(no.of phones)]) AS [month(no.of phones)] FROM your_table_name WHERE -- 替换为你表中实际的年份、月份字段匹配规则 [year] = @query_year AND [month] = @query_month GROUP BY country, city, ROLLUP((store, phonetype, phonename)) ORDER BY country, city, GROUPING(store), store, phonetype, phonename END GO
调用示例:
-- 查询2024年5月的统计结果 EXEC GetCityMonthlyPhoneStat @query_year=2024, @query_month=5
内容的提问来源于stack exchange,提问作者Chandhu
相关产品推荐
相关产品推荐

