【问题标题】:How do I add totals/subtotals to a set of results without grouping the row data?如何在不分组行数据的情况下将总计/小计添加到一组结果?
【发布时间】:2010-05-21 18:32:15
【问题描述】:

我正在为业务报告构建 SQL 查询。我需要在报告中同时显示小计(按文件编号分组)和总计。

我正在进入未知的 SQL 领域,所以这只是第一次尝试。我所做的查询几乎正常工作。唯一的问题是条目正在分组——我需要在报告中将它们分开。

这是我的示例数据:

文件编号日期费用费用
         2009 年 12 月 3 日 5 月 10 日
         2010 年 1 月 3 日 6 月 15 日
        3B 2010 年 3 月 28 日 1 3
        3B 2010 年 3 月 28 日 5 月 10 日

当我运行这个查询时

SELECT
    CASE
        WHEN (GROUPING(FileNumber) = 1) THEN NULL
        ELSE FileNumber
    END AS FileNumber,
    CASE
        WHEN (GROUPING(Date) = 1) THEN NULL
        ELSE Date
    END AS Date,
    SUM(Cost) AS Cost,
    SUM(Charge) AS Charge

    FROM SubtotalTesting
    GROUP BY FileNumber, Date WITH ROLLUP
    ORDER BY
        (CASE WHEN FileNumber IS NULL THEN 1 ELSE 0 END), -- Put NULLs after data
        FileNumber,
        (CASE WHEN Date IS NULL THEN 1 ELSE 0 END), -- Put NULLs after data
        Date

我得到以下信息:

文件编号日期费用费用
         2009 年 12 月 3 日 5 月 10 日
         2010 年 1 月 3 日 6 月 15 日
         3 无 11 25
        3B 2010 年 3 月 28 日 6 月 13 日 

想要的是:

FileNumber 日期 费用
         2009 年 12 月 3 日 5 月 10 日
         2010 年 1 月 3 日 6 月 15 日
         3 无 11 25
        3B 2010 年 3 月 28 日 1 3 

我可以清楚地看到为什么条目被分组,但我不知道如何在返回小计和总计的同时将它们分开。

在执行这样的高级 SQL 查询时,我有点犹豫,所以如果我使用 WITH ROLLUP 对问题采取了错误的方法,请建议一些首选的替代方案 - 你没有要为我编写整个查询,我只需要一些指导。谢谢!

【问题讨论】:

    标签: tsql grouping rollup


    【解决方案1】:
    WITH    SubtotalTesting (FileNumber, Date, Cost, Charge) AS
            (
            SELECT  '3', CAST('2009-22-12' AS DATETIME), 5, 10
            UNION ALL
            SELECT  '3', '2010-13-06', 6, 15
            UNION ALL
            SELECT  '3B', '2010-28-03', 1, 3
            UNION ALL
            SELECT  '3B', '2010-28-03', 5, 10
            ),
            q AS (
            SELECT  *,
                    ROW_NUMBER() OVER (ORDER BY filenumber) AS rn
            FROM    SubTotalTesting
            )
    SELECT  rn,
            CASE
                    WHEN (GROUPING(FileNumber) = 1) THEN NULL
                    ELSE FileNumber
            END AS FileNumber,
            CASE
                    WHEN (GROUPING(Date) = 1) THEN NULL
                    ELSE Date
            END AS Date,
            SUM(Cost) AS Cost,
            SUM(Charge) AS Charge
    FROM    q
    GROUP BY
            FileNumber, Date, rn WITH ROLLUP
    HAVING  GROUPING(rn) <= GROUPING(Date)
    ORDER BY
            (CASE WHEN FileNumber IS NULL THEN 1 ELSE 0 END),
            FileNumber,
            (CASE WHEN Date IS NULL THEN 1 ELSE 0 END),
            Date
    

    【讨论】:

    • (愚蠢的我。)我只是在源表上使用UNION ALLSELECT ... SUM(Cost) ... 来尝试这个——你的解决方案比这更有效吗?
    • @JonS: UNION 需要两次通过,所以是的,这个解决方案更有效。
    猜你喜欢
    • 2010-12-29
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多