怎樣匯總小計,合計值(求教高手)。

loverpyh 2007-06-11 11:13:06
我現在有這樣的一組數據,如下:

物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期
100 電腦1 P4 10 100 01 成品倉 100
200 電腦2 P2 10 100 01 成品倉 100
200 電腦2 P2 10 100 02 原料倉 100

300 機箱 XP 10 100 01 成品倉 100
300 機箱 XP 10 100 02 原料倉 100
300 機箱 XP 10 100 02 原料倉 100

我想對上面數據先按物料代碼排序,然后再按物料代碼分組,并匯總小計。最后加入總計,得到的結果應該如下:

物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期

300 機箱 XP 10 100 01 成品倉 100
機箱(小計) 30 300

200 電腦2 P2 10 100 01 成品倉 100
200 電腦2 P2 10 100 02 原料倉 100
電腦2(小計) 20 200

100 電腦1 P4 10 100 01 成品倉 100
電腦1(小計) 10 100

總計 60 600


請各位大俠幫忙!!先謝謝了!!!!!!!!!!!!!

...全文
871 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wgzaaa 2007-06-13
  • 打赏
  • 举报
回复
因为小计只能按前两项分组,用rollup多查出了一行总计,但其它处理比union 更复杂,我只能到那一步了,其它人答吧
ice241018 2007-06-13
  • 打赏
  • 举报
回复
学习
paoluo 2007-06-13
  • 打赏
  • 举报
回复
loverpyh(龙行天下) ( ) 信誉:99 Blog 加为好友 2007-06-12 21:31:26 得分: 0


想利用 ROLLUP实现


-------------
以下是用ROLLUP結合Grouping實現的,不過和你貼出來的結果有些出入,但是你貼出來的結果應該有些問題。


Create Table TEST(
物料代碼 Int,
物料名稱 Varchar(10),
規格 Varchar(10),
數量 Int,
金額 Int,
倉庫代碼 Varchar(10),
倉庫名稱 Varchar(10),
保質期 Int)
Insert TEST Select 100,'電腦1','P4',10,100,'01','成品倉',100
Union All Select 200,'電腦2','P2',10,100,'01','成品倉',100
Union All Select 200,'電腦2','P2',10,100,'02','原料倉',100
Union All Select 300,'機箱' ,'XP',10,100,'01','成品倉',100
Union All Select 300,'機箱' ,'XP',10,100,'02','原料倉',100
Union All Select 300,'機箱' ,'XP',10,100,'02','原料倉',100
GO
Select
(Case When Grouping(物料代碼) = 1 Then N'總計' Else RTRIM(物料代碼) End) As 物料代碼,
(Case When Grouping(物料名稱) = 1 And Grouping(物料代碼) = 0 Then MAX(物料名稱) + N'(小計)' Else RTRIM(物料名稱) End) As 物料名稱,
規格,
SUM(數量) As 數量,
SUM(金額) As 金額,
倉庫代碼,
倉庫名稱,
保質期
From
TEST
Group By
物料代碼,
物料名稱,
規格,
倉庫代碼,
倉庫名稱,
保質期
With RollUp
Having (保質期 Is Not Null Or 物料名稱 Is Null)
GO
Drop Table TEST
--Result
/*
物料代碼 物料名稱 規格 數量 金額 倉庫代碼 倉庫名稱 保質期
100 電腦1 P4 10 100 01 成品倉 100
100 電腦1(小計) NULL 10 100 NULL NULL NULL
200 電腦2 P2 10 100 01 成品倉 100
200 電腦2 P2 10 100 02 原料倉 100
200 電腦2(小計) NULL 20 200 NULL NULL NULL
300 機箱 XP 10 100 01 成品倉 100
300 機箱 XP 20 200 02 原料倉 100
300 機箱(小計) NULL 30 300 NULL NULL NULL
總計 NULL NULL 60 600 NULL NULL NULL
*/
  • 打赏
  • 举报
回复
哈哈,复制多了!后边的子查询对你没用!
  • 打赏
  • 举报
回复
--分类查询查询描述
--rollup操作符:选列中值的某一层次结构的聚合,返回单个结果集
--cube操作符:所选列中所有组合的聚合,返回单个结果集
--grouping操作符:判断结果集中的值是本来就有的,还是使用了rollup或cube以后产生的
--compute子句:不支持text、ntext、image数据类型,子句里的字段要和select中的字段相同,为字段创建详细的
--记录和汇总值,返回多个结果集
--compute by子句:需要和order by一起使用,字段需要是order by的子集或全集,创建细节记录和多个汇总值,返回多个结果集

--rollup的使用方法
select productid,orderID,sum(quantity) as total from [order details]
group by productid,orderID
with rollup

--cube的使用方法
select productid,orderID,sum(quantity) as total from [order details]
group by productid,orderID
with cube
--grouping的使用方法
select productid,grouping(productid),orderID,grouping(orderID),sum(quantity) as total from [order details]
group by productid,orderID
with cube

select case when (grouping(od.productid)=1) then '订单合计:'
else isnull(od.productid,'未知') end as productID,
case when (grouping(od.orderID)=1) then '产品合计:'
else isnull(od.orderID,'未知') end as productID,
sum(od.quantity) from (select convert(varchar(10),productid) as productID,convert(varchar(10),orderID) as orderid,quantity from [order details]) as od
group by productid,orderID
with cube
--compute的使用方法
select productid,quantity from [order details]
order by productid
compute sum(quantity) by productid

--嵌套子查询
select lastname,firstname from employees where employeeid in (select
employeeid from orders where oders.orderdate='1998-1-1')
--相关子查询
select lastname,firstname from employees as e
where '1998-1-1' in (select
orderdate from orders as o where o.employeeid=e.employeeid)

以上实例可在SQL Server2000自带数据库NorthWind中可直接运行!
对于使用cube和rollup引起的合计较多的问题,可以使用having关键字和grouping关键字来过滤。
  • 打赏
  • 举报
回复
使用ROLLUP和CUBE来实现!
http://www.v2studio.cn/blog/gaojier/article.asp?id=20
看看,不明白再联系我!
wgzaaa 2007-06-12
  • 打赏
  • 举报
回复
不知道为什么机箱只列一条明细
create table #tb(物料代碼 int,物料名稱 varchar(10),規格 varchar(10),數量 int,金額 int,倉庫代碼 varchar(10),倉庫名稱 varchar(10),保質期 int)
insert #tb select
100,'電腦1','P4',10,100,'01','成品倉',100 insert #tb select
200,'電腦2','P2',10,100,'01','成品倉',100 insert #tb select
200,'電腦2','P2',10,100,'02','原料倉',100 insert #tb select
300,'機箱' ,'XP',10,100,'01','成品倉',100 insert #tb select
300,'機箱' ,'XP',10,100,'02','原料倉',100 insert #tb select
300,'機箱' ,'XP',10,100,'02','原料倉',100
--------------------------------------------------------------------
select stuff(物料代碼0,1,4,'')as 物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期 from
(select rtrim(物料代碼)+'1'+rtrim(物料代碼) 物料代碼0,物料名稱,
規格,數量,金額,倉庫代碼,倉庫名稱,rtrim(保質期)保質期 from #tb
union all select rtrim(物料代碼)+'0'+物料名稱+'(小計)','','',sum(數量),
sum(金額),'','','' from #tb group by 物料代碼,物料名稱
union all select '0000總計','','',sum(數量),sum(金額),'','','' from #tb
)A order by A.物料代碼0 desc
---------------------------------------------------------------------
物料代碼 物料名稱 規格 數量 金額 倉庫代碼 倉庫名稱 保質期
300 機箱 XP 10 100 01 成品倉 100
300 機箱 XP 10 100 02 原料倉 100
300 機箱 XP 10 100 02 原料倉 100
機箱(小計) 30 300
200 電腦2 P2 10 100 02 原料倉 100
200 電腦2 P2 10 100 01 成品倉 100
電腦2(小計) 20 200
100 電腦1 P4 10 100 01 成品倉 100
電腦1(小計) 10 100
總計 60 600

(所影响的行数为 10 行)
zone305 2007-06-12
  • 打赏
  • 举报
回复
Select 物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期
From 表
ORDER BY 物料代碼 DESC
COMPUTE SUM(數量),SUM(金額) BY 物料代碼
fa_ge 2007-06-12
  • 打赏
  • 举报
回复

create table t(物料代碼 varchar(20),物料名稱 varchar(20),規格 varchar(20),數量 int,金額 int,倉庫代碼 varchar(20),倉庫名稱 varchar(20),保質期 int)
insert t select 100,'電腦1','P4',10,100,'01','成品倉',100
union all select 200,'電腦2','P2',10,100,'01','成品倉',100
union all select 200,'電腦2','P2',10,100,'02','原料倉',100
union all select 300,'機箱' ,'XP',10,100,'01','成品倉',100
union all select 300,'機箱' ,'XP',10,100,'02','原料倉',100
union all select 300,'機箱' ,'XP',10,100,'02','原料倉',100

select * from t
order by 物料代碼
compute sum(數量),sum(金額)by 物料代碼


物料代碼 物料名稱 規格 數量 金額 倉庫代碼 倉庫名稱 保質期
-------------------- -------------------- -------------------- ----------- ----------- -------------------- -------------------- -----------
100 電腦1 P4 10 100 01 成品倉 100

sum
===========
10

sum
===========
100


物料代碼 物料名稱 規格 數量 金額 倉庫代碼 倉庫名稱 保質期
-------------------- -------------------- -------------------- ----------- ----------- -------------------- -------------------- -----------
200 電腦2 P2 10 100 01 成品倉 100
200 電腦2 P2 10 100 02 原料倉 100

sum
===========
20

sum
===========
200


物料代碼 物料名稱 規格 數量 金額 倉庫代碼 倉庫名稱 保質期
-------------------- -------------------- -------------------- ----------- ----------- -------------------- -------------------- -----------
300 機箱 XP 10 100 01 成品倉 100
300 機箱 XP 10 100 02 原料倉 100
300 機箱 XP 10 100 02 原料倉 100

sum
===========
30

sum
===========
300


(9 row(s) affected)

gwallan 2007-06-12
  • 打赏
  • 举报
回复
mark
bill024 2007-06-12
  • 打赏
  • 举报
回复
create table test(物料代碼 varchar(20),物料名稱 varchar(20),規格 varchar(20),數量 int,金額 int,倉庫代碼 varchar(20),倉庫名稱 varchar(20),保質期 int)
insert test select 100,'電腦1','P4',10,100,'01','成品倉',100
union all select 200,'電腦2','P2',10,100,'01','成品倉',100
union all select 200,'電腦2','P2',10,100,'02','原料倉',100
union all select 300,'機箱' ,'XP',10,100,'01','成品倉',100
union all select 300,'機箱' ,'XP',10,100,'02','原料倉',100
union all select 300,'機箱' ,'XP',10,100,'02','原料倉',100

select 物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期 from
(
select 物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期=cast(保質期 as varchar),s1=0,s2=物料名稱,s3=0 from test
union all select 物料名稱+'(小計)','','',sum(數量),sum(金額),'','','',s1=0,s2=物料名稱,s3=1 from test
group by 物料名稱
union all select '總合計','','',sum(數量),sum(金額),'','','',s1=1,s2='',s3=1 from test
) t
order by s1,s2,s3

drop table test

/*
100 電腦1 P4 10 100 01 成品倉 100
電腦1(小計) 10 100
200 電腦2 P2 10 100 01 成品倉 100
200 電腦2 P2 10 100 02 原料倉 100
電腦2(小計) 20 200
300 機箱 XP 10 100 01 成品倉 100
300 機箱 XP 10 100 02 原料倉 100
300 機箱 XP 10 100 02 原料倉 100
機箱(小計) 30 300
總合計 60 600
*/
loverpyh 2007-06-12
  • 打赏
  • 举报
回复
想利用 ROLLUP实现
zone305 2007-06-12
  • 打赏
  • 举报
回复
Select 物料代碼,物料名稱,規格,數量,金額,倉庫代碼,倉庫名稱,保質期
From 表
ORDER BY 物料代碼 DESC
COMPUTE SUM(數量),SUM(金額) BY 物料代碼 --分类汇总
COMPUTE SUM(數量),SUM(金額) --总汇总
fa_ge 2007-06-12
  • 打赏
  • 举报
回复
select * from t
order by 物料代碼
compute sum(數量),sum(金額)by 物料代碼
coupute sum(數量)--這就是總計
vlsm 2007-06-11
  • 打赏
  • 举报
回复
Select 物料代碼,物料名稱,規格,sum(數量),(金額),倉庫代碼,倉庫名稱,保質期

FROM A

GROUP BY 物料代碼,物料名稱,規格, 倉庫代碼,倉庫名稱,保質期

WITH ROLLUP

:最主要的是
WITH ROLLUP ,

后续的美化可以用case语句来做

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧