小计及合计的问题?
原表:
公司 类别 产品 数量
gs1 lb1 cp1 10
gs1 lb1 cp2 10
gs1 lb2 cp3 10
gs1 lb2 cp4 10
gs2 lb1 cp5 10
gs2 lb1 cp6 10
gs2 lb2 cp7 10
gs2 lb2 cp8 10
要求:
公司 类别 产品 数量
gs1 lb1 cp1 10
gs1 lb1 cp2 10
gs1 lb1小计 20
gs1 lb2 cp3 10
gs1 lb2 cp4 10
gs1 lb2小计 20
gs1合计 40
gs2 lb1 cp5 10
gs2 lb1 cp6 10
gs2 lb1小计 20
gs2 lb2 cp7 10
gs2 lb2 cp8 10
gs2 lb2小计 20
gs2合计 40
总计 80
请各位高手指点。
[解决办法]
Select
(Case When Grouping(公司) = 0 And Grouping(产品) = 1 And Grouping(类别) = 1 Then 公司 + N '合计 '
When Grouping(公司) = 1 And Grouping(产品) = 1 And Grouping(类别) = 1 Then N '合计 '
Else 公司
End) As 公司,
(Case When Grouping(产品) = 1 And Grouping(类别) = 0 Then 类别 + N '小计 ' Else 类别 End) As 类别,
产品,
SUM(数量) As 数量
From TEST
Group By 公司, 类别, 产品
With Rollup
[解决办法]
Create Table TEST
(公司Varchar(10),
类别Varchar(10),
产品Varchar(10),
数量 Int)
Insert TEST Select 'gs1 ', 'lb1 ', 'cp1 ', 10
Union All Select 'gs1 ', 'lb1 ', 'cp2 ', 10
Union All Select 'gs1 ', 'lb2 ', 'cp3 ', 10
Union All Select 'gs1 ', 'lb2 ', 'cp4 ', 10
Union All Select 'gs2 ', 'lb1 ', 'cp5 ', 10
Union All Select 'gs2 ', 'lb1 ', 'cp6 ', 10
Union All Select 'gs2 ', 'lb2 ', 'cp7 ', 10
Union All Select 'gs2 ', 'lb2 ', 'cp8 ', 10
GO
Select
(Case When Grouping(公司) = 0 And Grouping(产品) = 1 And Grouping(类别) = 1 Then 公司 + N '合计 '
When Grouping(公司) = 1 And Grouping(产品) = 1 And Grouping(类别) = 1 Then N '合计 '
Else 公司
End) As 公司,
(Case When Grouping(产品) = 1 And Grouping(类别) = 0 Then 类别 + N '小计 ' Else 类别 End) As 类别,
产品,
SUM(数量) As 数量
From TEST
Group By 公司, 类别, 产品
With Rollup
Go
Drop Table TEST
--Result
/*
公司类别产品数量
gs1lb1cp110
gs1lb1cp210
gs1lb1小计NULL20
gs1lb2cp310
gs1lb2cp410
gs1lb2小计NULL20
gs1合计NULLNULL40
gs2lb1cp510
gs2lb1cp610
gs2lb1小计NULL20
gs2lb2cp710
gs2lb2cp810
gs2lb2小计NULL20
gs2合计NULLNULL40
合计NULLNULL80
*/
[解决办法]
CREATE TABLE A
(
公司 VARCHAR(10),
类别 VARCHAR(10),
产品 VARCHAR(10),
数量 INT
)
INSERT INTO A
SELECT 'gs1 ', 'lb1 ', 'cp1 ',10 UNION ALL
SELECT 'gs1 ', 'lb1 ', 'cp2 ',10 UNION ALL
SELECT 'gs1 ', 'lb2 ', 'cp3 ',10 UNION ALL
SELECT 'gs1 ', 'lb2 ', 'cp4 ',10 UNION ALL
SELECT 'gs2 ', 'lb1 ', 'cp5 ',10 UNION ALL
SELECT 'gs2 ', 'lb1 ', 'cp6 ',10 UNION ALL
SELECT 'gs2 ', 'lb2 ', 'cp7 ',10 UNION ALL
SELECT 'gs2 ', 'lb2 ', 'cp8 ',10
SELECT * FROM
(
SELECT 公司,类别,产品,数量 FROM A UNION ALL
SELECT 公司,类别, '小计 ' 产品,SUM(数量) 数量 FROM A GROUP BY 公司,类别 UNION ALL
SELECT 公司, '合计 ' 类别, ' ' 产品,SUM(数量) 数量 FROM A GROUP BY 公司 UNION ALL
SELECT '总计 ' 公司, ' ' 类别, ' ' 产品,SUM(数量) 数量 FROM A
) B
ORDER BY 公司,类别,产品
--
公司 类别 产品 数量
---------- ---------- ---------- -----------
gs1 lb1 cp1 10
gs1 lb1 cp2 10
gs1 lb1 小计 20
gs1 lb2 cp3 10
gs1 lb2 cp4 10
gs1 lb2 小计 20
gs1 合计 40
gs2 lb1 cp5 10
gs2 lb1 cp6 10
gs2 lb1 小计 20
gs2 lb2 cp7 10
gs2 lb2 cp8 10
gs2 lb2 小计 20
gs2 合计 40
总计 80
(15 行受影响)
[解决办法]
可以
Create Table TEST
(公司Varchar(10),
类别Varchar(10),
产品Varchar(10),
数量 Int)
Insert TEST Select 'gs1 ', 'lb1 ', 'cp1 ', 10
Union All Select 'gs1 ', 'lb1 ', 'cp2 ', 10
Union All Select 'gs1 ', 'lb2 ', 'cp3 ', 10
Union All Select 'gs1 ', 'lb2 ', 'cp4 ', 10
Union All Select 'gs2 ', 'lb1 ', 'cp5 ', 10
Union All Select 'gs2 ', 'lb1 ', 'cp6 ', 10
Union All Select 'gs2 ', 'lb2 ', 'cp7 ', 10
Union All Select 'gs2 ', 'lb2 ', 'cp8 ', 10
GO
Select
(Case When Grouping(产品) = 1 And Grouping(类别) = 1 Then 公司 + N '合计 ' Else 公司 End) As 公司,
(Case When Grouping(产品) = 1 And Grouping(类别) = 0 Then 类别 + N '小计 ' Else 类别 End) As 类别,
产品,
SUM(数量) As 数量
From TEST
Group By 公司, 类别, 产品
With Rollup
Having 公司 is Not Null
Go
Drop Table TEST
--Result
/*
公司类别产品数量
gs1lb1cp110
gs1lb1cp210
gs1lb1小计NULL20
gs1lb2cp310
gs1lb2cp410
gs1lb2小计NULL20
gs1合计NULLNULL40
gs2lb1cp510
gs2lb1cp610
gs2lb1小计NULL20
gs2lb2cp710
gs2lb2cp810
gs2lb2小计NULL20
gs2合计NULLNULL40
*/