原表:
公司 类别 产品 数量
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
请各位高手指点。
公司 类别 产品 数量
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
请各位高手指点。
(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
(公司 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
/*
公司 类别 产品 数量
gs1 lb1 cp1 10
gs1 lb1 cp2 10
gs1 lb1小计 NULL 20
gs1 lb2 cp3 10
gs1 lb2 cp4 10
gs1 lb2小计 NULL 20
gs1合计 NULL NULL 40
gs2 lb1 cp5 10
gs2 lb1 cp6 10
gs2 lb1小计 NULL 20
gs2 lb2 cp7 10
gs2 lb2 cp8 10
gs2 lb2小计 NULL 20
gs2合计 NULL NULL 40
合计 NULL NULL 80
*/
(
公司 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 行受影响)
可以不要总计那一行吗?
就是得到这种结果:
---------------------
公司 类别 产品 数量
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
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
/*
公司 类别 产品 数量
gs1 lb1 cp1 10
gs1 lb1 cp2 10
gs1 lb1小计 NULL 20
gs1 lb2 cp3 10
gs1 lb2 cp4 10
gs1 lb2小计 NULL 20
gs1合计 NULL NULL 40
gs2 lb1 cp5 10
gs2 lb1 cp6 10
gs2 lb1小计 NULL 20
gs2 lb2 cp7 10
gs2 lb2 cp8 10
gs2 lb2小计 NULL 20
gs2合计 NULL NULL 40
*/