2010-05-21 3 views
2

Я создаю 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, пожалуйста, предложите некоторые предпочтительные альтернативы - вам не нужно напишите весь запрос для меня, мне просто нужно какое-то направление. Благодаря!

ответ

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

(Stupid me.) Я просто пытался это использовать с помощью 'UNION ALL' в исходной таблице с помощью' SELECT ... SUM (Cost) ... '- ваше решение более эффективно? –

+0

@JonS: 'UNION' потребует два прохода, так что да, это решение более эффективно. – Quassnoi

+0

Это сработало отлично! Большое спасибо. –

Смежные вопросы