Sql 如何显示这样的小计值?

Sql 如何显示这样的小计值?,sql,sql-server,database,sql-server-2005,Sql,Sql Server,Database,Sql Server 2005,我有一张这样的桌子:- 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

我有一张这样的桌子:-

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,它将给出如下输出,其中“
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

一种方法使用
分组集
,但您需要一个聚合查询。您可以这样写:

select Branch, SL, Month, sum(Amount1), sum(Amount2), sum(Amount3)
from t
group by grouping sets ( (Branch, SL, Month), (branch) );
分组集
仅从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;

一种方法使用
分组集
,但您需要一个聚合查询。您可以这样写:

select Branch, SL, Month, sum(Amount1), sum(Amount2), sum(Amount3)
from t
group by grouping sets ( (Branch, SL, Month), (branch) );
分组集
仅从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;
试试这个

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

如果您确实需要获得
分支
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 |
+--------+----+----------+---------+---------+---------+
试试这个

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

如果您确实需要获得
分支
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 |
+--------+----+----------+---------+---------+---------+

我必须使用SQL Server 2005,兼容吗?将第二个子查询中的第二个
NULL
替换为
'Subtotal'
我必须使用SQL Server 2005,兼容吗?将第二个子查询中的第二个
NULL
替换为
'Subtotal'
不能在SQL中添加总计行或小计行。为此,请使用报告工具。通常有组头和组尾。例如,在页眉中显示年份或分支(或任何分组依据),在页脚中显示小计。不能在SQL中添加总计行或小计行。为此,请使用报告工具。通常有组头和组尾。例如,在页眉中显示年份或分支机构(或任何分组依据),在页脚中显示小计。