Промежуточные итоги и SQL - PullRequest
       20

Промежуточные итоги и SQL

1 голос
/ 23 декабря 2010

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

Итак, приведена таблица, подобная следующей:

CUS_ID  | PRODUCT | AMOUNT
12      | A       |  2.50
12      | B       |  5.80
24      | A       |  10.00
24      | B       |  30.00

Я бы получил следующий результат:

CUS_ID  | Product | AMOUNT
24      | A       |  10.00
24      | B       |  30.00
24      | Total   |  30.00
12      | A       |  2.50
12      | B       |  5.00
12      | Total   |  7.50

Пока что я могу прийти со следующим запросом:

  SELECT cus_id, product, amount FROM Sales
UNION ALL
  (SELECT cus_id, 'ZZZZ' AS product, SUM(amount) FROM Sales GROUP BY cus_id)
ORDER BY cus_id, product

Тем не менее, в запросе используется «ZZZZ» вместо «Всего» (что впоследствии может быть исправлено путем поиска и замены), но он не сортируется в порядке убывания количества.

РЕДАКТИРОВАТЬ : Пожалуйста, не стесняйтесь публиковать ответы, не относящиеся к сортировке. Некоторые ответы на самом деле были очень полезны для меня.

Ответы [ 2 ]

5 голосов
/ 23 декабря 2010

Посмотрите на что-то вроде

DECLARE @Sales TABLE(
        CUS_ID  INT,
        PRODUCT VARCHAR(20),
        AMOUNT FLOAT
)
INSERT INTO @Sales SELECT 12,'A', 2.50 
INSERT INTO @Sales SELECT 12,'B', 5.80 
INSERT INTO @Sales SELECT 24,'A', 10.00 
INSERT INTO @Sales SELECT 24,'B', 30.00

;WITH Vals AS (
        SELECT  cus_id, 
                product, 
                amount,
                1 DisplayOrder,
                SUM(amount) OVER(PARTITION BY cus_id) OrderTotal
        FROM    @Sales 
        UNION ALL   
        SELECT  cus_id, 
                'Total' AS product, 
                SUM(amount),
                2 DisplayOrder,
                SUM(amount)
        FROM    @Sales 
        GROUP BY cus_id
)
SELECT  cus_id,
        product,
        amount
FROM    Vals
ORDER BY  OrderTotal DESC,cus_id,DisplayOrder, product 
4 голосов
/ 23 декабря 2010

Поскольку вы счастливы, что у вас нет сортировки, это быстрый ответ, прежде чем я вернусь к работе.На сервере Sql есть фантастическая функция отчетности - С Rollup.Он автоматически добавляет итоги и итоги в запрос;на основе используемых вами группировок.

В качестве очень быстрого примера с использованием определения таблицы @ astander

   DECLARE @Sales TABLE(
            CUS_ID  INT,
            PRODUCT VARCHAR(20),
            AMOUNT FLOAT
    )
    INSERT INTO @Sales SELECT 12,'A', 2.50 
    INSERT INTO @Sales SELECT 12,'B', 5.80 
    INSERT INTO @Sales SELECT 24,'A', 10.00 
    INSERT INTO @Sales SELECT 24,'B', 30.00

Select Cus_ID, Product, SUM(Amount)
From @Sales
group by cus_id, product with rollup

Возвращается

Cus_ID      Product              
----------- -------------------- ----------------------
12          A                    2.5
12          B                    5.8
12          NULL                 8.3
24          A                    10
24          B                    30
24          NULL                 40
NULL        NULL                 48.3

Чтобы было легче писатьВ ваших отчетных данных извлекаются и идентифицируются строки промежуточных итогов, есть функция - группировка - которую вы можете запрашивать по группам по элементам.В приведенном ниже примере он идентифицирует промежуточные итоги и итоговые строки.

DECLARE @Sales TABLE(
        CUS_ID  INT,
        PRODUCT VARCHAR(20),
        AMOUNT FLOAT
)
INSERT INTO @Sales SELECT 12,'A', 2.50 
INSERT INTO @Sales SELECT 12,'B', 5.80 
INSERT INTO @Sales SELECT 24,'A', 10.00 
INSERT INTO @Sales SELECT 24,'B', 30.00

select 
    case 
        when GROUPING(product) = 1 and GROUPING(cus_id) = 0 then 'Sub Total - Customer -' + cast(Cus_ID as varchar(10)) 
        when GROUPING(product) = 1 and GROUPING(cus_id) = 1 then 'Total'
        else cast(Cus_ID as varchar(10)) end as Cus_ID,
        PRODUCT, 
    sum(Amount) as Total_Amount 
From @sales 
group by cus_id, product with rollup

Возвращение

Cus_ID                           PRODUCT              Total_Amount
-------------------------------- -------------------- ----------------------
12                               A                    2.5
12                               B                    5.8
Sub Total - Customer -12         NULL                 8.3
24                               A                    10
24                               B                    30
Sub Total - Customer -24         NULL                 40
Total                            NULL                 48.3

Небольшой твик заставит его выполнить сортировку, после которой вы.

...