日期:2014-05-18  浏览次数:20404 次

请教一个SQL查询
一个车辆维修记录表表1,包含车号、维修时间、维修费用合计等字段,表2包含车辆登记日期字段,以登记日期为起始时间按年度统计某一车号的维修费用总和,如车号 '陕AH2425 '从登记日期2001年2月14日起到2002年2月13日为第一年度的维修费用总合;以2002年2月14日到2003年2月13日为第二年度维修费用总和,以次类推到现在时间;同时统计该车历年度累计维修费用,如第二年度累计维修费用为第一、第二年度维修费用总合,第三年度累计维修费用为一、二、三年度维修费用总合,依次类推到现在时间,写了好久没有写出来,请高手帮忙,多谢!

------解决方案--------------------
select
a.车号,
case when dateadd(year,datediff(year,b.车辆登记日期,a.维修时间),b.车辆登记日期) <a.维修时间 then convert(varchar(10),dateadd(year,datediff(year,b.车辆登记日期,a.维修时间),b.车辆登记日期),120)+ '到 '+convert(varchar(10),dateadd(year,datediff(year,b.车辆登记日期,a.维修时间)+1,b.车辆登记日期),120)
else convert(varchar(10),dateadd(year,datediff(year,b.车辆登记日期,a.维修时间)-1,b.车辆登记日期),120)+ '到 '+convert(varchar(10),dateadd(year,datediff(year,b.车辆登记日期,a.维修时间),b.车辆登记日期),120)
end as 年度,
sum(a.维修费用合计) as 维修费用总和,
(select sum(a.维修费用合计) from 表1 where 车号=a.车号 and 维修时间 <case when dateadd(year,datediff(year,b.车辆登记日期,a.维修时间),b.车辆登记日期) <a.维修时间 then dateadd(year,datediff(year,b.车辆登记日期,a.维修时间)+1,b.车辆登记日期)
else dateadd(year,datediff(year,b.车辆登记日期,a.维修时间),b.车辆登记日期)
end) as 累计维修费用
from 表1 a,表2 b
where a.车号=b.车号
group by a.车号,case when dateadd(year,datediff(year,b.车辆登记日期,a.维修时间),b.车辆登记日期) <a.维修时间 then convert(varchar(10),dateadd(year,datediff(year,b.车辆登记日期,a.维修时间),b.车辆登记日期),120)+ '到 '+convert(varchar(10),dateadd(year,datediff(year,b.车辆登记日期,a.维修时间)+1,b.车辆登记日期),120)
else convert(varchar(10),dateadd(year,datediff(year,b.车辆登记日期,a.维修时间)-1,b.车辆登记日期),120)+ '到 '+convert(varchar(10),dateadd(year,datediff(year,b.车辆登记日期,a.维修时间),b.车辆登记日期),120)
end


--这个语句好晕
--没测试