2

我正在为业务报告构建 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 日 <--
        3B 空 6 13
      无 无 17 38

想要的是:

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

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

在执行这样的高级 SQL 查询时,我有点绿色,所以如果我使用错误的方法来解决问题WITH ROLLUP,请提出一些首选的替代方案——你不必为我,我只是需要一些方向。谢谢!

4

1 回答 1

4
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
于 2010-05-21T19:22:07.940 回答