如何显示这样的小计值?
How to show Sub Total value like this?
我有一个 table 这样的:-
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
一种方法使用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;
试试这个
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 |
+--------+----+----------+---------+---------+---------+
我有一个 table 这样的:-
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
一种方法使用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;
试试这个
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 |
+--------+----+----------+---------+---------+---------+