首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

小计及合计的有关问题

2012-01-07 
小计及合计的问题?原表:公司类别产品数量gs1lb1cp110gs1lb1cp210gs1lb2cp310gs1lb2cp410gs2lb1cp510gs2lb1

小计及合计的问题?
原表:
公司                 类别             产品             数量          
  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
*/


热点排行