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

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

2012-02-24 
请教一个统计报表的sql语句??谢谢大家帮助! createtable部门表(部门编号varchar(4),部门名称varchar(20),

请教一个统计报表的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
*/

热点排行