2

ビジネス レポート用の SQL クエリを作成しています。レポートには小計 (ファイル番号でグループ化) と総計の両方が必要です。

私は未知の SQL 領域に入っているので、これは少し初めての試みです。私が作成したクエリはほとんど機能しています。唯一の問題は、エントリがグループ化されていることです。レポートでそれらを分離する必要があります。

ここに私のサンプルデータがあります:

FileNumber Date 料金
         3 2009 年 12 月 22 日 5 10
         3 2010 年 1 月 13 日 6 15
        3B 10/3/28 1 3
        3B 3月 28/10 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

私は以下を取得します:

FileNumber Date 料金
         3 2009 年 12 月 22 日 5 10
         3 2010 年 1 月 13 日 6 15
         3 ヌル 11 25
        3B 3 月 28/10 6 13 <--
        3B ヌル 6 13
      ヌル ヌル 17 38

私が欲しいのは:

FileNumber Date 料金
         3 2009 年 12 月 22 日 5 10
         3 2010 年 1 月 13 日 6 15
         3 ヌル 11 25
        3B 2010 年 3 月 28 日 1 3 <--
        3B 3月 28/10 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 に答える