Как добавить итоги / промежуточные итоги в набор результатов, не группируя данные строк? - PullRequest
2 голосов
/ 21 мая 2010

Я создаю 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

Когда я запускаю этот запрос

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  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

Что я хочу :

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

Я ясно вижу , почему записи группируются, но я не знаю, как их разделить, при этом возвращая промежуточные итоги и итоговую сумму.

Я немного зелен, когда дело доходит до выполнения сложных SQL-запросов, подобных этому, поэтому, если я использую WITH ROLLUP неправильный подход к проблеме, предложите несколько предпочтительных альтернатив - у вас нет чтобы написать весь запрос для меня, мне просто нужно какое-то направление. Спасибо!

1 Ответ

4 голосов
/ 21 мая 2010
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
...