读书人

请问一个统计报表的sql语句?多谢大家帮

发布时间: 2012-02-24 16:30:38 作者: rapoo

请教一个统计报表的sql语句??谢谢大家帮助!

create table 部门表
(
部门编号 varchar(4),
部门名称 varchar(20),
部门类别 varchar(20)
)
insert into 部门表 select '01 ', 'a营业部 ',null
insert into 部门表 select '0101 ', 'a1营业厅 ', '自有厅 '
insert into 部门表 select '0102 ', 'a2营业厅 ', '自有厅 '
insert into 部门表 select '0103 ', 'b1营业厅 ', '合作厅 '
insert into 部门表 select '0104 ', 'b2营业厅 ', '合作厅 '
insert into 部门表 select '0104 ', 'b3营业厅 ', '合作厅 '

--------------------------------
create table 收费表
(

项目名称 varchar(20),
当日营业款 decimal(13,2),
日期 datetime,
所属部门 varchar(20)
)
insert into 收费表 select '合作厅营业款 ',10000, '2007-1-1 ', 'b1营业厅 '
insert into 收费表 select '合作厅营业款 ',20000, '2007-1-1 ', 'b2营业厅 '
insert into 收费表 select '合作厅营业款 ',15000, '2007-1-2 ', 'b1营业厅 '
insert into 收费表 select '合作厅营业款 ',30000, '2007-1-2 ', 'b2营业厅 '

----------------------------------

create table 押金表
(
合作厅名称 varchar(20),
押金金额 decimal(13,2),
交款日期 datetime,
补交押金金额 decimal(13,2),
退还押金金额 decimal(13,2)
)
insert into 押金表 select 'b1营业厅 ',1000, '2007-1-1 ',500,300
insert into 押金表 select 'b2营业厅 ',2000, '2007-1-1 ',1000,600
insert into 押金表 select 'b1营业厅 ',3000, '2007-1-2 ',1500,400
insert into 押金表 select 'b2营业厅 ',4000, '2007-1-2 ',2000,800
--------------------------------------
/*
要生成的报表格式为:(按照收费表的日期区间范围进行统计,例如统计2007-1-1到2007-1-2这2天的数据)
合作厅名称 押金余额 总收费额 日平均收费额 差额
b1营业厅 5300 25000 12500 7200
b2营业厅 7600 50000 25000 17400
b3营业厅 0 0 0 0
*/
drop table 部门表
drop table 收费表
drop table 押金表
/*
报表数据说明:

合作厅名称:指部门表中所有类别为“合作厅”的营业厅
押金余额=指押金表中的“押金金额+补交押金金额-退还押金金额”注意:这里的押金余额是累加的,即2007-1-2的余额=2007-1-1的余额+2007-1-2的余额
总收费额=收费表中2007-1-1到2007-1-2时间段内,每个合作厅当日营业款的总和
日平均收费额=总收费额/2007-1-1到2007-1-2之间的天数(按照收费表的日期范围进行统计)
差额=日平均收费额-押金余额

------------------------
如果对应部门表里的合作厅没有费用产生,请将报表中各种费用设置为0.00


*/

[解决办法]
select 部门表.部门名称,
押金余额=isnull(押金表.押金余额, 0),
总收费额=isnull(收费表.总收费额, 0),
日平均收费额=isnull(收费表.日平均收费额, 0),
差额=isnull(收费表.日平均收费额, 0)-isnull(押金表.押金余额, 0)
from 部门表
left join(
select 合作厅名称, 押金余额=sum(押金金额+补交押金金额-退还押金金额)
from 押金表
group by 合作厅名称
)押金表 on 部门表.部门名称=押金表.合作厅名称
left join(
select 所属部门, 总收费额=sum(当日营业款), 日平均收费额=sum(当日营业款)/datediff(day, '2007-1-1 ', '2007-1-3 ')
from 收费表
where 日期> = '2007-1-1 ' and 日期 < '2007-1-3 '
group by 所属部门
)收费表 on 部门表.部门名称=收费表.所属部门
where 部门表.部门类别= '合作厅 '

--result
部门名称 押金余额 总收费额 日平均收费额 差额
-------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ----------------------------------------
b1营业厅 5300.00 25000.00 12500.000000 7200.00
b2营业厅 7600.00 50000.00 25000.000000 17400.00
b3营业厅 .00 .00 .000000 .00

(3 row(s) affected)
[解决办法]
--取时间天数为单位
select a.部门名称,
[押金余额]=(select isnull(sum(押金金额+补交押金金额-退还押金金额),0) from 押金表 where 合作厅名称=a.部门名称
and convert(varchar(10),交款日期,120) between '2007-1-1 ' and '2007-1-2 '),
[总收费额]=(select isnull(sum(当日营业款),0) from 收费表 where 所属部门=a.部门名称),
[日平均收费额]=(select isnull(avg(当日营业款),0) from 收费表 where 所属部门=a.部门名称),
[差额]=(select isnull(avg(当日营业款),0) from 收费表 where 所属部门=a.部门名称
and convert(varchar(10),日期,120) between '2007-1-1 ' and '2007-1-2 ')-
(select isnull(sum(押金金额+补交押金金额-退还押金金额),0) from 押金表 where 合作厅名称=a.部门名称
and convert(varchar(10),交款日期,120) between '2007-1-1 ' and '2007-1-2 ')
from 部门表 a

a营业部.00.00.000000.00
a1营业厅.00.00.000000.00
a2营业厅.00.00.000000.00
b1营业厅.0025000.0012500.000000.00
b2营业厅.0050000.0025000.000000.00
b3营业厅.00.00.000000.00

[解决办法]
--没留意有点小问题,修改一下
select a.部门名称,
[押金余额]=(select isnull(sum(isnull(押金金额,0)+isnull(补交押金金额,0)-isnull(退还押金金额,0)),0)
from 押金表 where 合作厅名称=a.部门名称
and convert(varchar(10),交款日期,120) between '2007-01-01 ' and '2007-01-02 ' ),
[总收费额]=(select isnull(sum(当日营业款),0) from 收费表 where 所属部门=a.部门名称),
[日平均收费额]=(select isnull(avg(当日营业款),0) from 收费表 where 所属部门=a.部门名称),
[差额]=
(select isnull(avg(当日营业款),0) from 收费表 where 所属部门=a.部门名称)
-(select isnull(sum(isnull(押金金额,0)+isnull(补交押金金额,0)-isnull(退还押金金额,0)),0)
from 押金表 where 合作厅名称=a.部门名称
and convert(varchar(10),交款日期,120) between '2007-01-01 ' and '2007-01-02 ' )
from 部门表 a
部门名称 押金余额 总收费额 日平均收费额 差额
-------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ----------------------------------------
a营业部 .00 .00 .000000 .00


a1营业厅 .00 .00 .000000 .00
a2营业厅 .00 .00 .000000 .00
b1营业厅 5300.00 25000.00 12500.000000 7200.00
b2营业厅 7600.00 50000.00 25000.000000 17400.00
b3营业厅 .00 .00 .000000 .00

(所影响的行数为 6 行)
结果为:
/*
a营业部.00.00.000000.00
a1营业厅.00.00.000000.00
a2营业厅.00.00.000000.00
b1营业厅5300.0025000.0012500.0000007200.00
b2营业厅7600.0050000.0025000.00000017400.00
b3营业厅.00.00.000000.00
*/

读书人网 >SQL Server

热点推荐