create function Todate(@year smallint,@month tinyint)
returns datetime
as
begin
declare @date datetime
select @date=cast(
cast(@year as varchar(4))+‘-'+cast(@month as varchar(2)+'-1'
as datetime)
return(@date)
end
查询代码:
select
a.name ,a. year,a. month a.money,
case when a.money-b.money >0 then a.money-b.money else -1*(a.money-b.money ) end
as 下月对比
case when a.money-b.money >0 then '减少' else '增加' end as 得到下月结果
case when a.money-c.money >0 then a.money-b.money else -1*(a.money-c.money ) end
as 上月对比
case when a.money-c.money >0 then '增加' else '减少' end as 得到上月结果
from 工资表 a left join
(select name,dateadd(mm,-1, dbo.Todate(year,month)) as 下月,money from 工资表)b
on a.name=b.name and a.year=year(b.下月) and a.month=b.month(b.下月)
left join
(select name,dateadd(mm,1, dbo.Todate(year,month)) as 上月,money from 工资表)c
on a.name=b.name and a.year=year(c.上月) and a.month=b.month(c.上月)
怎么改题目了?搞的我还把开始的要求给算出来了,如下:select
a.月份,
case when b.本月收入总额=0 or b.本月收入总额 IS null then null else
(a.本月收入总额-b.本月收入总额)/b.本月收入总额*100 end 收入增长百分比,
a.本月支出总额,
case when b.本月支出总额=0 or b.本月支出总额 IS null then null else
(a.本月支出总额-b.本月支出总额)/b.本月支出总额*100 end 支出增长百分比,
a.本月余额,
case when b.本月余额<=0 or b.本月余额 IS null then null else
(a.本月余额-b.本月余额)/b.本月余额*100 end 余额增长百分比
from
(
select
MONTH(日期) 月份,
isnull(SUM(收入金额),0) 本月收入总额,
isnull(SUM(支出金额),0) 本月支出总额,
isnull(SUM(收入金额),0)-isnull(SUM(支出金额),0) 本月余额
from 收支表
group by MONTH(日期)
) a
left join
(
select
MONTH(日期) 月份,
isnull(SUM(收入金额),0) 本月收入总额,
isnull(SUM(支出金额),0) 本月支出总额,
isnull(SUM(收入金额),0)-isnull(SUM(支出金额),0) 本月余额
from 收支表
group by MONTH(日期)
) b
on a.月份=b.月份+1
order by a.月份 desc
搞到最后才发现你是ACCESS数据库,晕死,那以上SQL Server 代码可能有些地方要修改
比如:case when then else end语句,不知ACCESS是否支持
left join可能要改成left outer join
isnull()函数,不知access是否支持
month()函数,不知access是否支持
用ACCESS完成这么复杂的运算,的确困难.
补充,用case主要是用来排除0和空值,比如,你6月份的收入为0,7月份的收入3500,那么收入增长百分比就是3500/0,结果是无穷大,你在ACCESS中怎么排除这种情况?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)