Подведение промежуточных итогов по нескольким группам

Рейтинг: 0Ответов: 1Опубликовано: 28.02.2023

Доброго времени суток всем!

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

Пример агрегации:

Филиал Продажи
1 A 3
2 B 2
3 Total A + B 5
4 C 1
5 D 3
6 Total C + D 4
7 E 2
8 F 3
9 Total E + F 5
10 Total C + D + E + F 9
11 Total A + B + C + D + E + F 14

Результаты считаются с помощью CTE, из которой через union подводятся промежуточные итоги.

Вопрос: Как просчитывать промежуточные результаты в строках 3, 6, 9, 10, 11 без использования union в select?

Ответы

▲ 1

Как вариант:

  1. агрегировать и разделить по филиалам в PIVOT
  2. там же сразу собрать промежуточные итоги
  3. перевернуть таблицу обратно UNPIVOT

Простой пример:

-- автор не указал исходную структуру таблицы
CREATE TABLE testTable (
  BranchID VARCHAR(1) NOT NULL
);

-- предположу что идет одна запись на продажу
INSERT INTO testTable VALUES ('A');
INSERT INTO testTable VALUES ('A');
INSERT INTO testTable VALUES ('A');
INSERT INTO testTable VALUES ('B');
INSERT INTO testTable VALUES ('B');
INSERT INTO testTable VALUES ('C');
INSERT INTO testTable VALUES ('D');
INSERT INTO testTable VALUES ('D');
INSERT INTO testTable VALUES ('D');
INSERT INTO testTable VALUES ('E');
INSERT INTO testTable VALUES ('E');
INSERT INTO testTable VALUES ('F');
INSERT INTO testTable VALUES ('F');
INSERT INTO testTable VALUES ('F');

-- выборка
SELECT
  ROW_NUMBER() OVER (ORDER BY 1) AS "№",
  u.testCol AS "Филиал",
  u.value AS "Продажи"
FROM
  (
    -- промежуточные итоги
    SELECT
      p."'A'" AS "A",
      p."'B'" AS "B",
      p."'A'" + p."'B'" AS "A + B",
      p."'C'" AS "C",
      p."'D'" AS "D",
      p."'C'" + p."'D'" AS "C + D",
      p."'E'" AS "E",
      p."'F'" AS "F",
      p."'E'" + p."'F'" AS "E + F",
      p."'C'" + p."'D'" + p."'E'" + p."'F'" AS "C + D + E + F",
      p."'A'" + p."'B'" + p."'C'" + p."'D'" + p."'E'" + p."'F'" AS "A + B + C + D + E + F"
    FROM
      testTable
      -- переворачиваем
      PIVOT (
        -- количество продаж
        COUNT(BranchID) 
        -- отдельно по филиалам
        FOR BranchID 
        IN ('A', 'B', 'C', 'D', 'E', 'F')
      ) p
  ) t
  -- убираем переворот
  UNPIVOT (
    VALUE
    FOR testCol
    IN (
      ("A") AS 'A',
      ("B") AS 'B',
      ("A + B") AS 'A + B',
      ("C") AS 'C',
      ("D") AS 'D',
      ("C + D") AS 'C + D',
      ("E") AS 'E',
      ("F") AS 'F',
      ("E + F") AS 'E + F',
      ("C + D + E + F") AS 'C + D + E + F',
      ("A + B + C + D + E + F") AS 'A + B + C + D + E + F'
    )
  ) u