关于数据分组统计的问题

hnzgw 2006-03-08 09:48:54
日期 旅行社名称 票证 人数 金额
01 上海园林旅行社有限公司 观潮公园团体日票 12 144.00
02 上海园林旅行社有限公司 观潮公园团体日票 2 72.00
02 上海园林旅行社有限公司 王国维故居团体票 8 48.00
01 浙江大学旅行社 观潮公园团体日票 7 84.00
03 浙江大学旅行社 海神庙团体票 23 138.00

希望得到的结果是:
日期 旅行社名称 票证 人数 金额
01、02 上海园林旅行社有限公司 观潮公园团体日票 14 22 264
、王国维故居团体票 8
01、03 浙江大学旅行社 观潮公园团体日票 7 30 222
、海神庙团体票 23

希望各位大侠帮帮忙,小弟急用,我希望,结果就是根据上面的五条记录,得到下面二条记录,不过日期和票证要分别列出来,并且,票证要分别统计,但属同一旅行社的写在一行上
...全文
87 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
mislrb 2006-03-08
create table t_a(日期 varchar(2),旅行社名称 varchar(100),票证 varchar(100),人数 int,金额 decimal(38,2))
insert t_a
select '01','上海园林旅行社有限公司','观潮公园团体日票',12 ,144.00 union all
select '02','上海园林旅行社有限公司','观潮公园团体日票',2 ,72.00 union all
select '02','上海园林旅行社有限公司','王国维故居团体票',8 ,48.00 union all
select '01','浙江大学旅行社','观潮公园团体日票', 7 ,84.00 union all
select '03','浙江大学旅行社','海神庙团体票', 23 ,138.00

select id=identity(int,1,1),日期=(select min(日期) from t_a where 旅行社名称=t.旅行社名称)+'-'+(select max(日期) from t_a where 旅行社名称=t.旅行社名称),
t.旅行社名称,t.票证,人数=sum(t.人数),总人数=(select sum(人数) from t_a where 旅行社名称=t.旅行社名称),总金额=(select sum(金额) from t_a where 旅行社名称=t.旅行社名称) --,金额=sum(t.金额)
into #t
from t_a t
group by t.旅行社名称,t.票证


select 日期=case when not exists(select 1 from #t where id<t.id and 旅行社名称=t.旅行社名称) then t.日期 else '' end,
旅行社名称=case when not exists(select 1 from #t where id<t.id and 旅行社名称=t.旅行社名称) then t.旅行社名称 else '' end,
t.票证,t.人数,
总人数=case when not exists(select 1 from #t where id<t.id and 旅行社名称=t.旅行社名称) then t.总人数 else null end,
总金额=case when not exists(select 1 from #t where id<t.id and 旅行社名称=t.旅行社名称) then t.总金额 else null end
from #t t

drop table t_a,#t

--结果
/*
日期 旅行社名称 票证 人数 总人数 总金额
----- ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- ----------- ----------- ----------------------------------------
01-02 上海园林旅行社有限公司 观潮公园团体日票 14 22 264.00
王国维故居团体票 8 NULL NULL
01-03 浙江大学旅行社 观潮公园团体日票 7 30 222.00
海神庙团体票 23 NULL NULL
*/
回复
-狙击手- 2006-03-08
create table ttest(日期 char(2),旅行社名称 varchar(100),票证 varchar(100),人数 int,金额 int)
insert ttest
select '01','上海园林旅行社有限公司','观潮公园团体日票',12,144.00 union all
select '02','上海园林旅行社有限公司','观潮公园团体日票',2,72.00 union all
select '02','上海园林旅行社有限公司','王国维故居团体票',8,48.00 union all
select '01','浙江大学旅行社','观潮公园团体日票',7,84.00 union all
select '03','浙江大学旅行社','海神庙团体票',23,138.00


create function f_addstr(@rq varchar(100))
returns varchar(100)
as
begin
declare @s varchar(8000)
SET @S = ''
select @s = @s+','+日期 from
(select distinct 日期 from ttest where CHARINDEX(@rq,旅行社名称)>0) a
set @s = stuff(@s,1,1,'')
return @s
end
go
DROP FUNCTION F_ADDSTR1
go
create function f_addstr1(@rq varchar(100))
returns varchar(100)
as
begin
declare @s varchar(8000)
SET @S = ''
select @s = @s+'、'+票证+cast((select sum(人数)
from ttest where CHARINDEX(@rq,旅行社名称)>0 and 票证 = a.票证
) as varchar(10))
from (select distinct 票证
from ttest where CHARINDEX(@rq,旅行社名称)>0 ) a
set @s = stuff(@s,1,1,'')
return @s
end
go


select 日期,旅行社名称,票证,sum(a.人数),sum(a.金额)
from (select dbo.f_addstr(旅行社名称) as 日期,旅行社名称,
dbo.f_addstr1(旅行社名称) as 票证,人数,金额
from ttest) a
group by 日期,旅行社名称,票证



回复
zlp321002 2006-03-08
--用函数实现合并.
参考这个贴的写法:

http://community.csdn.net/Expert/topic/4599/4599800.xml?temp=.0320856
回复
lsqkeke 2006-03-08
根据上面的五条记录,得到下面二条记录
--------------------------
是两条记录吗?
回复
lsqkeke 2006-03-08
用函数:

回复
yuweiwei 2006-03-08
记录大吗?不大的话,用游标也可以!!
定义了2个游标,和一个临时表 @mytable
declare @mytable table (日期 varchar(10),旅行社名称 varchar(100),票证 varchar(100),人数 int,金额 int)
declare @lvse varchar(50)
declare mycur cursor for select distinct 旅行社名称 from ttest

open mycur
fetch next from mycur into @lvse
while(@@fetch_status=0)
begin

declare @date varchar(10)
declare @piao varchar(100)
declare @num int
declare @prise int
declare @date11 varchar(10)
declare @piao11 varchar(100)
declare @num11 int
declare @prise11 int
set @date11=''
set @piao11=''
set @num11=0
set @prise11=0
declare mycur2 cursor for select 日期 ,票证,人数,金额 from ttest where 旅行社名称=@lvse
open mycur2
fetch next from mycur2 into @date,@piao ,@num,@prise
while(@@fetch_status=0)
begin

set @date11=@date11+@date+','
set @piao11=@piao11+@piao+' '+convert(varchar(10),@num)+','
set @num11=@num11+@num
set @prise11=@prise11+@prise

fetch next from mycur2 into @date,@piao ,@num,@prise
end
insert into @mytable(日期,旅行社名称,票证,人数,金额) values (@date11,@lvse,@piao11,@num11,@prise11)
close mycur2
deallocate mycur2
fetch next from mycur into @lvse
end
close mycur
deallocate mycur

select * from @mytable
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2006-03-08 09:48
社区公告
暂无公告