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

得出结余款的SQL写法

2012-01-20 
求一个得出结余款的SQL写法? createtablet_zc_fk--支出费用(罚款表)(btbmvarchar(50),--本趟编码sj_name1v

求一个得出结余款的SQL写法?

create   table   t_zc_fk   --支出费用(罚款表)
(
btbm   varchar(50),     --本趟编码
sj_name1   varchar(50),--主司机姓名
sj_name2   varchar(50),--副司机姓名
je   decimal(13,2)--罚款金额
)
insert   into   t_zc_fk   select   '1 ', '主司机 ', '副司机 ',100
insert   into   t_zc_fk   select   '1 ', '主司机 ', '副司机 ',150

insert   into   t_zc_fk   select   '2 ', '主司机 ', '副司机 ',100
insert   into   t_zc_fk   select   '2 ', '主司机 ', '副司机 ',200

create   table   t_zc_jy   --支出费用(加油表)
(
btbm   varchar(50),     --本趟编码
sj_name1   varchar(50),--主司机姓名
sj_name2   varchar(50),--副司机姓名
dj   decimal(13,2),--汽油单价
ss   int   --加油升数  
)
insert   into   t_zc_jy   select   '1 ', '主司机 ', '副司机 ',10,10
insert   into   t_zc_jy   select   '1 ', '主司机 ', '副司机 ',15,10

insert   into   t_zc_jy   select   '2 ', '主司机 ', '副司机 ',10,20
insert   into   t_zc_jy   select   '2 ', '主司机 ', '副司机 ',15,30

create   table   t_zc_lq   --支出费用(路桥表)
(
btbm   varchar(50),     --本趟编码
sj_name1   varchar(50),--主司机姓名
sj_name2   varchar(50),--副司机姓名
je   decimal(13,2)--过路费金额
)

insert   into   t_zc_lq   select   '1 ', '主司机 ', '副司机 ',100
insert   into   t_zc_lq   select   '1 ', '主司机 ', '副司机 ',150

insert   into   t_zc_lq   select   '2 ', '主司机 ', '副司机 ',100
insert   into   t_zc_lq   select   '2 ', '主司机 ', '副司机 ',200


create   table   t_zc_pj   --支出费用(配件表)
(
btbm   varchar(50),     --本趟编码
sj_name1   varchar(50),--主司机姓名
sj_name2   varchar(50),--副司机姓名
dj   decimal(13,2),--配件单价
sl   int   --配件数量  
)
insert   into   t_zc_pj   select   '1 ', '主司机 ', '副司机 ',10,10
insert   into   t_zc_pj   select   '1 ', '主司机 ', '副司机 ',15,10

insert   into   t_zc_pj   select   '2 ', '主司机 ', '副司机 ',10,20
insert   into   t_zc_pj   select   '2 ', '主司机 ', '副司机 ',15,30


create   table   t_zc_xl   --支出费用(修理表)
(
btbm   varchar(50),     --本趟编码
sj_name1   varchar(50),--主司机姓名
sj_name2   varchar(50),--副司机姓名
fy   decimal(13,2)--修理费用
)

insert   into   t_zc_xl   select   '1 ', '主司机 ', '副司机 ',100
insert   into   t_zc_xl   select   '1 ', '主司机 ', '副司机 ',150

insert   into   t_zc_xl   select   '2 ', '主司机 ', '副司机 ',100
insert   into   t_zc_xl   select   '2 ', '主司机 ', '副司机 ',200


create   table   t_zc_zf   --支出费用(杂费表)
(
btbm   varchar(50),     --本趟编码
sj_name1   varchar(50),--主司机姓名
sj_name2   varchar(50),--副司机姓名
je   decimal(13,2)--杂费金额
)
insert   into   t_zc_zf   select   '1 ', '主司机 ', '副司机 ',100


insert   into   t_zc_zf   select   '1 ', '主司机 ', '副司机 ',150

insert   into   t_zc_zf   select   '2 ', '主司机 ', '副司机 ',100
insert   into   t_zc_zf   select   '2 ', '主司机 ', '副司机 ',200

create   table   t_xclc   --行车里程表
(
btbm   varchar(50),     --本趟编码
sj_name1   varchar(50),--主司机姓名
sj_name2   varchar(50),--副司机姓名
ccdk   int   --出车带现金数
)
insert   into   t_xclc   select   '1 ', '主司机 ', '副司机 ',10000
insert   into   t_xclc   select   '2 ', '主司机 ', '副司机 ',8000
/*
要得到每一趟出车结余款的数目
第1趟出车,第一趟结余款的数目=行车里程表中的第一趟出车带现金数   -   (支出费用(罚款表)中的第1趟的金额总和   +   支出费用(加油表)中的第1趟的金额总和   +   支出费用(路桥表)中的第1趟的金额总和   +   支出费用(配件表)中的第1趟的金额总和   +   支出费用(修理表)中的第1趟的金额总和   +   支出费用(杂费表)中的第1趟的金额总和)
            即:     第一趟结余款的数目=10000   -   (250   +   250   +   250   +   250   +   250   +   250)=9000
第2趟出车,第2趟结余款的数目=第一趟结余款的数目   +   行车里程表中的第2趟出车带现金数   -   (支出费用(罚款表)中的第2趟的金额总和   +   支出费用(加油表)中的第2趟的金额总和   +   支出费用(路桥表)中的第2趟的金额总和   +   支出费用(配件表)中的第2趟的金额总和   +   支出费用(修理表)中的第2趟的金额总和   +   支出费用(杂费表)中的第2趟的金额总和)
            即:     第2趟结余款的数目=9000+8000   -   (300   +   650   +   300   +   650   +   300   +   300)=14500
第3趟出车的结余款按照公式以此类推.......

查询条件按照主,副司机的名字和出车趟数进行查询。
*/

drop   table   t_zc_fk
drop   table   t_zc_jy
drop   table   t_zc_lq
drop   table   t_zc_pj
drop   table   t_zc_xl
drop   table   t_zc_zf
drop   table   t_xclc

[解决办法]
先写个单次结余的:

select
a.btbm,a.sj_name1,a.sj_name2,
a.ccdk-isnull(b.fee,0)
-isnull(c.fee,0)
-isnull(d.fee,0)
-isnull(e.fee,0)
-isnull(f.fee,0)
-isnull(g.fee,0) as 结余
from
t_xclc a
left join (select btbm,sj_name1,sj_name2,sum(je) as fee from t_zc_fk group by btbm,sj_name1,sj_name2) b on a.btbm=b.btbm and a.sj_name1=b.sj_name1 and a.sj_name2=b.sj_name2
left join (select btbm,sj_name1,sj_name2,sum(dj*ss) as fee from t_zc_jy group by btbm,sj_name1,sj_name2) c on a.btbm=c.btbm and a.sj_name1=c.sj_name1 and a.sj_name2=c.sj_name2
left join (select btbm,sj_name1,sj_name2,sum(je) as fee from t_zc_lq group by btbm,sj_name1,sj_name2) d on a.btbm=d.btbm and a.sj_name1=d.sj_name1 and a.sj_name2=d.sj_name2
left join (select btbm,sj_name1,sj_name2,sum(dj*sl) as fee from t_zc_pj group by btbm,sj_name1,sj_name2) e on a.btbm=e.btbm and a.sj_name1=e.sj_name1 and a.sj_name2=e.sj_name2
left join (select btbm,sj_name1,sj_name2,sum(fy) as fee from t_zc_xl group by btbm,sj_name1,sj_name2) f on a.btbm=f.btbm and a.sj_name1=f.sj_name1 and a.sj_name2=f.sj_name2
left join (select btbm,sj_name1,sj_name2,sum(je) as fee from t_zc_zf group by btbm,sj_name1,sj_name2) g on a.btbm=g.btbm and a.sj_name1=g.sj_name1 and a.sj_name2=g.sj_name2
order by
a.btbm,a.sj_name1,a.sj_name2
[解决办法]
declare @sj_name1 varchar(50),--主司机姓名
@sj_name2 varchar(50),--副司机姓名
@btbm varchar(50) --本趟编码
select @sj_name1= '主司机 ',@sj_name2= '副司机 ',@btbm= '1 '


select 余额=sum(je) from
(
select je=-1.0*je from t_zc_fk where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=-1.0*dj*ss from t_zc_jy where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=-1.0*je from t_zc_lq where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=-1.0*dj*sl from t_zc_pj where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=-1.0*fy from t_zc_xl where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=-1.0*je from t_zc_zf where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=1.0*ccdk from t_xclc where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int)
) as tb

select @sj_name1= '主司机 ',@sj_name2= '副司机 ',@btbm= '2 '
select 余额=sum(je) from
(
select je=-1.0*je from t_zc_fk where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=-1.0*dj*ss from t_zc_jy where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=-1.0*je from t_zc_lq where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=-1.0*dj*sl from t_zc_pj where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=-1.0*fy from t_zc_xl where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=-1.0*je from t_zc_zf where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int) union all
select je=1.0*ccdk from t_xclc where sj_name1=@sj_name1 and sj_name2=@sj_name2 and cast(btbm as int) <=cast(@btbm as int)
) as tb
[解决办法]
declare @t_zc_fk table--支出费用(罚款表)
(
btbm varchar(50), --本趟编码
sj_name1 varchar(50),--主司机姓名
sj_name2 varchar(50),--副司机姓名
je decimal(13,2)--罚款金额
)
insert into @t_zc_fk select '1 ', '主司机 ', '副司机 ',100
insert into @t_zc_fk select '1 ', '主司机 ', '副司机 ',150
insert into @t_zc_fk select '2 ', '主司机 ', '副司机 ',100
insert into @t_zc_fk select '2 ', '主司机 ', '副司机 ',200

declare @t_zc_jy table--支出费用(加油表)
(
btbm varchar(50), --本趟编码
sj_name1 varchar(50),--主司机姓名
sj_name2 varchar(50),--副司机姓名
dj decimal(13,2),--汽油单价
ss int --加油升数
)
insert into @t_zc_jy select '1 ', '主司机 ', '副司机 ',10,10
insert into @t_zc_jy select '1 ', '主司机 ', '副司机 ',15,10
insert into @t_zc_jy select '2 ', '主司机 ', '副司机 ',10,20
insert into @t_zc_jy select '2 ', '主司机 ', '副司机 ',15,30

declare @t_zc_lq table--支出费用(路桥表)
(
btbm varchar(50), --本趟编码
sj_name1 varchar(50),--主司机姓名
sj_name2 varchar(50),--副司机姓名
je decimal(13,2)--过路费金额
)
insert into @t_zc_lq select '1 ', '主司机 ', '副司机 ',100
insert into @t_zc_lq select '1 ', '主司机 ', '副司机 ',150
insert into @t_zc_lq select '2 ', '主司机 ', '副司机 ',100
insert into @t_zc_lq select '2 ', '主司机 ', '副司机 ',200

declare @t_zc_pj table--支出费用(配件表)
(
btbm varchar(50), --本趟编码
sj_name1 varchar(50),--主司机姓名
sj_name2 varchar(50),--副司机姓名


dj decimal(13,2),--配件单价
sl int --配件数量
)
insert into @t_zc_pj select '1 ', '主司机 ', '副司机 ',10,10
insert into @t_zc_pj select '1 ', '主司机 ', '副司机 ',15,10
insert into @t_zc_pj select '2 ', '主司机 ', '副司机 ',10,20
insert into @t_zc_pj select '2 ', '主司机 ', '副司机 ',15,30

declare @t_zc_xl table--支出费用(修理表)
(
btbm varchar(50), --本趟编码
sj_name1 varchar(50),--主司机姓名
sj_name2 varchar(50),--副司机姓名
fy decimal(13,2)--修理费用
)
insert into @t_zc_xl select '1 ', '主司机 ', '副司机 ',100
insert into @t_zc_xl select '1 ', '主司机 ', '副司机 ',150
insert into @t_zc_xl select '2 ', '主司机 ', '副司机 ',100
insert into @t_zc_xl select '2 ', '主司机 ', '副司机 ',200

declare @t_zc_zf table--支出费用(杂费表)
(
btbm varchar(50), --本趟编码
sj_name1 varchar(50),--主司机姓名
sj_name2 varchar(50),--副司机姓名
je decimal(13,2)--杂费金额
)
insert into @t_zc_zf select '1 ', '主司机 ', '副司机 ',100
insert into @t_zc_zf select '1 ', '主司机 ', '副司机 ',150
insert into @t_zc_zf select '2 ', '主司机 ', '副司机 ',100
insert into @t_zc_zf select '2 ', '主司机 ', '副司机 ',200

declare @t_xclc table--行车里程表
(
btbm varchar(50), --本趟编码
sj_name1 varchar(50),--主司机姓名
sj_name2 varchar(50),--副司机姓名
ccdk int --出车带现金数
)

insert into @t_xclc select '1 ', '主司机 ', '副司机 ',10000
insert into @t_xclc select '2 ', '主司机 ', '副司机 ',8000

/*
要得到每一趟出车结余款的数目
第1 趟出车,第一趟结余款的数目=行车里程表中的第一趟出车带现金数 - (支出费用(罚款表)中的第1趟的金额总和 + 支出费用(加油表)中的第1趟的金额总和 + 支出费用(路桥表)中的第1趟的金额总和 + 支出费用(配件表)中的第1趟的金额总和 + 支出费用(修理表)中的第1趟的金额总和 + 支出费用(杂费表)中的第1趟的金额总和)
即: 第一趟结余款的数目=10000 - (250 + 250 + 250 + 250 + 250 + 250)=9000
第2 趟出车,第2趟结余款的数目=第一趟结余款的数目 + 行车里程表中的第2趟出车带现金数 - (支出费用(罚款表)中的第2趟的金额总和 + 支出费用(加油表)中的第2趟的金额总和 + 支出费用(路桥表)中的第2趟的金额总和 + 支出费用(配件表)中的第2趟的金额总和 + 支出费用(修理表)中的第2趟的金额总和 + 支出费用(杂费表)中的第2趟的金额总和)
即: 第2趟结余款的数目=9000+8000 - (300 + 650 + 300 + 650 + 300 + 300)=14500
第3趟出车的结余款按照公式以此类推.......

查询条件按照主,副司机的名字和出车趟数进行查询。
*/

select
a.btbm,
结余=a.total-isnull(b.total,0)-isnull(c.total,0)-isnull(d.total,0)-isnull(e.total,0)-isnull(f.total,0)-isnull(g.total,0)
from
(select btbm, total=(select sum(ccdk) from @t_xclc where btbm <=a.btbm) from @t_xclc a group by btbm) a
left join
(select btbm, total=(select sum(je) from @t_zc_zf where btbm <=a.btbm) from @t_zc_zf a group by btbm) b
on a.btbm=b.btbm
left join
(select btbm, total=(select sum(fy) from @t_zc_xl where btbm <=a.btbm) from @t_zc_xl a group by btbm) c
on a.btbm=c.btbm
left join
(select btbm, total=(select sum(dj*sl) from @t_zc_pj where btbm <=a.btbm) from @t_zc_pj a group by btbm) d
on a.btbm=d.btbm
left join
(select btbm, total=(select sum(je) from @t_zc_lq where btbm <=a.btbm) from @t_zc_lq a group by btbm) e
on a.btbm=e.btbm
left join
(select btbm, total=(select sum(dj*ss) from @t_zc_jy where btbm <=a.btbm) from @t_zc_jy a group by btbm) f
on a.btbm=f.btbm
left join
(select btbm, total=(select sum(je) from @t_zc_fk where btbm <=a.btbm) from @t_zc_fk a group by btbm) g
on a.btbm=g.btbm

/*
btbm,结余
1,8500.00
2,14000.00
*/

热点排行