You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

输出效果示例

针对你提供的测试数据,运行后输出如下:

countrycitystorephonetypephonenamemonth(no.of phones)
Indiabangalorerelianceandroidoneplus22
Indiabangalorerelianceandroidvivo167
Indiabangalorerelianceandroidredmi106
Indiabangalore城市合计295
IndiaHyderabadBigCandroidoppo223
IndiaHyderabadBigCandroidvivo55
IndiaHyderabad城市合计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:24:04