Tsql 如何在不分组行数据的情况下将总计/小计添加到一组结果中?

Tsql 如何在不分组行数据的情况下将总计/小计添加到一组结果中?,tsql,grouping,rollup,Tsql,Grouping,Rollup,我正在为业务报表构造一个SQL查询。我需要在报告中按文件号和总计对小计进行分组 我正在进入未知的SQL领域,所以这是第一次尝试。我提出的问题几乎奏效了。唯一的问题是条目正在分组-我需要在报告中将它们分开 以下是我的示例数据: FileNumber Date Cost Charge 3 Dec 22/09 5 10 3 Jan 13/10 6 15 3B Mar 28/

我正在为业务报表构造一个SQL查询。我需要在报告中按文件号和总计对小计进行分组

我正在进入未知的SQL领域,所以这是第一次尝试。我提出的问题几乎奏效了。唯一的问题是条目正在分组-我需要在报告中将它们分开

以下是我的示例数据:

FileNumber Date Cost Charge 3 Dec 22/09 5 10 3 Jan 13/10 6 15 3B Mar 28/10 1 3 3B Mar 28/10 5 10 我得到以下信息:

FileNumber Date Cost Charge 3 Dec 22/09 5 10 3 Jan 13/10 6 15 3 NULL 11 25 3B Mar 28/10 6 13 <-- 3B NULL 6 13 NULL NULL 17 38 我想要的是:

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


在做这样的高级SQL查询时,我有点生疏,因此如果我使用WITH ROLLUP解决问题的方法错误,请建议一些首选的替代方法-您不必为我编写整个查询,我只需要一些指导。谢谢

愚蠢的我。我只是通过在源表上使用UNIONALL和SELECT来尝试这一点。。。SUMCost…-你的解决方案比这更有效吗?@JonS:UNION需要两次通过,所以是的,这个解决方案更有效。
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
FileNumber Date Cost Charge 3 Dec 22/09 5 10 3 Jan 13/10 6 15 3 NULL 11 25 3B Mar 28/10 1 3 <-- 3B Mar 28/10 5 10 <-- 3B NULL 6 13 NULL NULL 17 38
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