Как показать Sub Total value, как это? - PullRequest
0 голосов
/ 21 октября 2018

У меня есть таблица, подобная этой: -

Branch       SL       Month     Amount1 Amount2 Amount3
    A         1       January    100       0        0
    A         2       February     0       0        0
    A         3       March       80       0        0
    A         4       April        0      10       10
    A         5       May          0       0        0
    A         6       June         0       0        0
    A         7       July         0       0       10
    A         8       August       0      10        0
    A         9       September    0      10        0
    A        10       October     40       0       10
    A        11       November    10      10       10
    A        12       December     0      10       10
    B         1       January      0       0       10
    B         2       February    10      10       10
    B         3       March        0       0       10

Теперь я пытаюсь показать промежуточный итог по каждой ветви, который будет выдавать такой результат, где 'Subtotal' отображается после каждых 12строк и прямо под столбцом месяца "Subtotal" написано.И первые 2 столбца будут пустыми, я пытаюсь добиться этого с помощью UNION ALL, но не получилось.

Branch  SL    Month   Amount1     Amount2    Amount3
A        1    January     100           0          0
A        2    February      0           0          0
A        3    March        80           0          0
A        4    April         0          10         10
A        5    May           0           0          0
A        6    June          0           0          0
A        7    July          0           0         10
A        8    August        0          10          0
A        9    September     0          10          0
A        10   October      40           0         10
A        11   November     10          10         10
A        12   December      0          10         10
              Subtotal    230          50         50
B        1    January       0           0         10
B        2    February     10          10         10
B        3    March         0           0         10

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Попробуйте это

CREATE TABLE T
(
   Branch VARCHAR(1),
   SL INT,
   Month VARCHAR(3),
   Amount1 INT,
   Amount2 INT,
   Amount3 INT
);

INSERT INTO T VALUES
('A', 1, 'Jan', 10, 0, 10),
('A', 2, 'Feb', 20, 0, 20),
('B', 1, 'Jan', 5, 5, 5),
('B', 2, 'Feb', 20, 0, 20),
('C', 1, 'Jan', 55, 44, 33);

WITH CTE AS
(
  SELECT *
  FROM T
  UNION ALL
  SELECT Branch + ' SubTotal', NULL, 'SubTotal', SUM(Amount1), SUM(Amount2), SUM(Amount3)
  FROM T
  GROUP BY Branch
)
SELECT Branch,
       SL,
       Month,
       Amount1,
       Amount2,
       Amount3
FROM CTE
ORDER BY Branch;

Результаты:

+------------+----+----------+---------+---------+---------+
|   Branch   | SL |  Month   | Amount1 | Amount2 | Amount3 |
+------------+----+----------+---------+---------+---------+
| A          |  1 | Jan      |      10 |       0 |      10 |
| A          |  2 | Feb      |      20 |       0 |      20 |
| A SubTotal |    | SubTotal |      30 |       0 |      30 |
| B          |  1 | Jan      |       5 |       5 |       5 |
| B          |  2 | Feb      |      20 |       0 |      20 |
| B SubTotal |    | SubTotal |      25 |       5 |      25 |
| C          |  1 | Jan      |      55 |      44 |      33 |
| C SubTotal |    | SubTotal |      55 |      44 |      33 |
+------------+----+----------+---------+---------+---------+

Если вам действительно нужно получить Branch и SL пробел (''), вы можете сделатькак

WITH CTE AS
(
  SELECT Seq = Branch + 'X1',*
  FROM T
  UNION ALL
  SELECT Branch + 'X2', '', NULL, 'SubTotal', SUM(Amount1), SUM(Amount2), SUM(Amount3)
  FROM T
  GROUP BY Branch
)
SELECT Branch,
       SL,
       Month,
       Amount1,
       Amount2,
       Amount3
FROM CTE
ORDER BY Seq;

и результаты совпадают с вашими ожидаемыми результатами

+--------+----+----------+---------+---------+---------+
| Branch | SL |  Month   | Amount1 | Amount2 | Amount3 |
+--------+----+----------+---------+---------+---------+
| A      |  1 | Jan      |      10 |       0 |      10 |
| A      |  2 | Feb      |      20 |       0 |      20 |
|        |    | SubTotal |      30 |       0 |      30 |
| B      |  1 | Jan      |       5 |       5 |       5 |
| B      |  2 | Feb      |      20 |       0 |      20 |
|        |    | SubTotal |      25 |       5 |      25 |
| C      |  1 | Jan      |      55 |      44 |      33 |
|        |    | SubTotal |      55 |      44 |      33 |
+--------+----+----------+---------+---------+---------+
0 голосов
/ 21 октября 2018

Один метод использует grouping sets, но вам нужен запрос агрегации.Вы можете написать это как:

select Branch, SL, Month, sum(Amount1), sum(Amount2), sum(Amount3)
from t
group by grouping sets ( (Branch, SL, Month), (branch) );

grouping sets доступны только с 2008 года.В более ранних версиях вы можете сделать:

select t.*
from ((select branch, sl, month, amount1, amount2, amount3
       from t
      ) union all
      (select Branch, null, 'Subtotal', sum(Amount1), sum(Amount2), sum(Amount3)
       from t
       group by branch
      )
     ) t
order by branch,
         (case when sl is not null then 1 else 2 end),
         sl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...