Сводная строка SQL после деталей - PullRequest
4 голосов
/ 09 ноября 2009

Привет, Stackoverflow, суперзвезды ...

Вот моя проблема. У меня есть хранимая процедура, которая выводит довольно простую таблицу сгруппированных и суммированных значений. Типичные вещи ... название компании, количество клиентов в компании, коммерческий представитель компании, годовой доход компании и т. Д.

Это отлично работает.

Что мне сейчас нужно, так это итоговая строка. В последней строке вывода должна быть сумма количества клиентов, годовой доход и т. Д. То же самое, что вы сделали бы, нажав на кнопку автосуммирования в Excel. (Кстати, именно то, что мы делаем сейчас.)

Мое исходное предположение состоит в том, чтобы вставить все данные во временную таблицу в хранимой процедуре, а затем вставить итоговые значения в самом конце перед выпуском данных.

Мысли? Это слишком запутанно?

Спасибо

Ответы [ 4 ]

6 голосов
/ 09 ноября 2009

Добавьте WITH ROLLUP в конец вашего запроса. Это даст вам итоговые строки для каждой группировки. Вы можете добавить дополнительный столбец, используя функцию GROUPING (столбец), чтобы определить, является ли строка строкой свертки или нет.

Пример MSDN :

SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL'
            ELSE ISNULL(Item, 'UNKNOWN')
       END AS Item,
       CASE WHEN (GROUPING(Color) = 1) THEN 'ALL'
            ELSE ISNULL(Color, 'UNKNOWN')
       END AS Color,
       SUM(Quantity) AS QtySum
FROM Inventory
GROUP BY Item, Color WITH ROLLUP
Item                 Color                QtySum                     
-------------------- -------------------- -------------------------- 
Chair                Blue                 101.00                     
Chair                Red                  210.00                     
Chair                ALL                  311.00                     
Table                Blue                 124.00                     
Table                Red                  223.00                     
Table                ALL                  347.00                     
ALL                  ALL                  658.00                     
1 голос
/ 09 ноября 2009
WITH    data AS
        (
        SELECT  1 AS id, 1 AS value
        UNION ALL
        SELECT  1 AS id, 2 AS value
        UNION ALL
        SELECT  2 AS id, 5 AS value
        )
SELECT  id, COUNT(*) AS cnt, AVG(VALUE) AS a
FROM    data
GROUP BY id WITH ROLLUP

Этот запрос вернет дополнительную строку с NULL в поле id и суперрегрегрегирует в соответствующих полях.

1 голос
/ 09 ноября 2009

Ваш совет по временным таблицам звучит довольно хорошо.

Вы можете сделать так, чтобы хранимая процедура возвращала два отдельных набора результатов, но это обычно становится проблемой, когда вам нужно прочитать данные через ADO.NET или что-то еще.

Но я бы хотел, чтобы вы предложили временную таблицу.

0 голосов
/ 09 ноября 2009

ROLLUP, упомянутый в других ответах, очень полезен, но позор, что COMPUTE устарело.

Это дает отдельный набор результатов после основного, поэтому вам не нужно разделять сводку на клиенте.

Тем не менее, он все еще в SQL Server 2008, так что ему осталось жить еще несколько лет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...