sql求近n天的数据

本帖最后由 cherishdqy 于 2017-4-8 23:58 编辑

先说明数据库(SQL SERVER 2008 R2)表字段及示例数据:
业务逻辑:集团:有2家单位,每个单位有不同的账户,每个账户都有自己的期初余额,每个账户每一天只要有收入金额或支出金额,就会在数据库中插入一条数据(和财务的出纳日记账类似,但这里的记录已经对当天该账户的所有收入和支出做了汇总),但不是每一天都会有记录。

需求:假设当前日期为2017-01-08,求出每一个账户近5天(2017-01-04至2017-01-08)的每天的结余(每天的结余=该账户的期初余额+小于等于该天的所有收入金额-小于等于该天的所有支出金额)。
即单位1的账户1:
   2017-01-04的结余为:100+(10+30)-(0+0)=140
      即期初余额(100)+1号至4号的收入总和(10+30)-1号至4号的支出总和(0+0)
   2017-01-05的结余为:100+(10+30+20)-(0+0+0)=160
   2017-01-06的结余为:160(6号没有发生记录,所以结余为5号的结余)
   2017-01-07的结余为:100+(10+30+20+30)-(0+0+0+0)=190
   2017-01-08的结余为:190(8号没有发生记录,所以结余为7号的结余)

其实最终的需求是要求出这个集团近5天的每一天的所有账户的结余的总和,作为集团近5天的每一天的结余,然后画出折线图。

这个需求想了一整天没想出最后的结果,提供一下我想到一半的思路:求出每个账户按日期计算的收入累计求和和支出累计求和,然后用每一天的期初余额+收入累计-支出累计即可得出每一天的结余,但是有个问题就是像账户1只能得到4、5、7号的结余,sql中有办法将没有的日期整出来么?
如果sql做不到,可以考虑用报表做,正在尝试中。。。但是考虑到源数据表目前三个月有七千多条数据,放到单元格中处理再隐藏行页面加载速度会慢,所以先发帖问一下有没有sql大神能用sql做出来。
@macro_hard @yets11 @zsh331 @gxy120313 @Poseidon @flyingsnake @真实姓名 不记得谁sql比较6了,先艾特一波~excel附件是两张图的数据~



FineReportcherishdqy 发布于 2017-4-8 23:50
悬赏:5 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共5回答
最佳回答
0
fengyuejun发布于2017-4-8 23:50(编辑于 2023-9-6 09:34)
555
最佳回答
0
fengyuejun发布于2017-4-9 00:54(编辑于 2023-9-6 09:34)
555
最佳回答
0
fengyuejun发布于2017-4-9 01:13(编辑于 2023-9-6 09:34)
555
  • cherishdqy cherishdqy(提问者)

    此方法可行!简单粗暴!是我想复杂了!
    [attach]61800[/attach]
    不过最终集团的sql的逻辑要在外面套一层,不能用后面的集团的求法,因为数据源中还有个期初余额字段,每个账户的结余应该是期初余额+sum(收入)-sum(支出),集团的每天结余不能直接用期初余额+sum(收入)-sum(支出),而应该是每个账户的结余的总和,所以sql改为
    select sum(a.day1) as day1,sum(a.day2) as day2,sum(a.day3) as day3,sum(a.day4) as day4,sum(a.day5) as day5
    from
    (
        select 单位,账户,
        sum(case when 日期<=date()-4 then 收入-支出 else 0 end) as day1,
        sum(case when 日期<=date()-3 then 收入-支出 else 0 end) as day2,
        sum(case when 日期<=date()-2 then 收入-支出 else 0 end) as day3,
        sum(case when 日期<=date()-1 then 收入-支出 else 0 end) as day4,
        sum(case when 日期<=date()-0 then 收入-支出 else 0 end) as day5
        from table
        group by 单位,账户
    ) as a
    然后sql中列转行即可,就不需要用到单元格的层次坐标了。
    最后回复你最后一句话:我说数据量多的意思是把所有的数据拖到单元格中去处理成我需要的数据,然后隐藏单元格所在行,这个会影响页面加载速度,和数据库没关系哈~

    回复
    2017-04-09 03:36 
最佳回答
0
cherishdqy发布于2017-4-9 03:36(编辑于 2023-9-6 09:34)
555
最佳回答
0
小龙发布于2017-4-9 04:05(编辑于 2023-9-6 09:34)
555
  • 0关注人数
  • 1237浏览人数
  • 最后回答于:2017-4-9 04:05
    活动推荐 更多
    热门课程 更多
    返回顶部