今天继续聊下报表,还是以一个普通的进销存报表为例。
情景:
1、 销售一台手机则往销售记录表插入一条记录,状态为U。库存记录表该记录移至库存历史表。
2、用户退机则在库存记录表里面新增一笔记录,状态为退机,同时把以前的那条销售记录置为E(失效), 同时把库存历史表该记录删除。
3、如果门店把手机退给供货商,则把库存记录表中该记录状态修改为退机在途,同时在出入库表中新增一笔出库记录,状态为出库完成。
4、供货商收到退的手机,则把库存记录表的归属组织改为供货商,状态改为供货商入库,同时在出入库表中新增一笔入库记录,状态为入库完成。
如果按上面的情景写一张门店进销存报表,怎么写呢?
如果你写成这样:
门店名称 开始库存 销售量 退机量 库存结余
测试门店 5 2 1 4
一开始我也是这么写的,但是你没有考虑下面的情况
1、我怎么知道是什么时候统计的?所以得加上统计时间列。
2、我想知道手机如三星 G100今天的进销存情况怎么办,统计精度得具体到手机的机型
3、我怎么区分用户退机和退给供货商,退机量得分为用户退和返厂量。
4、退机已出库,为什么看不到退机数? 在供货商没入库之前,该库存一直属于门店,所以为了直观的表示今天我退了3台手机给供货商,但供货商没入库,得加上退机在途。
综合上述,报表的这样:
统计时间 门店名称 机型名称 开始库存 销售量 用户退 返厂量 退机在途 库存结余
2014-07-18 XX XX 5 2 1 0 1 4
你以为这样就完了。还有什么情况?
这里要重点分析下销售和退机,销售量不就是
select count(*) from 销售记录表 where 状态='U' and record_date=统计时间
退机量不就是:
select count(*) from 库存记录表 where 状态=用户退 and 记录时间=统计时间
下面我分以下情况:
1、当天卖了台三星G100,且用户当天没有退,也就是无退机记录,销售量=
select count(*) from 销售记录表 where 状态='U' and record_date=统计时间
2、当天用户把昨天买的三星G100退了,没有在买其他手机,则用户退=。
select count(*) from 库存记录表 where 状态=用户退 and 记录时间=统计时间
3、当天上午用户买了台三星G99,下午用户又把它退了,换了台三星G99,则销售量=
select count(*) from 销售记录表 where 状态='U' and record_date=统计时间
用户退=
select count(*) from 库存记录表 where 状态=用户退 and 记录时间=统计时间
这样算还是有问题,如开始库存为2,上午卖了一台,销售为1,下午用户换了台手机,则用户退=1,销量=1,库存结余=2-1+1=2,实际库存为1,所以的减掉换机数
select count(*) from 销售记录表 a,库存记录表 b where a.状态=E and b.状态=用户退 and exists(select 1 from 销售记录表 b where b.状态='U' and b.销售时间>=a.销售时间 and b.销售时间<统计时间+1 and b.机型=a.机型) and a.销售时间=统计时间
这里的换机数视为销售量。
4、当天上午用户买了台三星G100,下午又退掉了,没买其他手机。则时候销售量=0,退机数=1,库存=开始库存2+退机数=3,凭空多了一台手机,也是不对的。
还得统计当天买了又退了且没有再买的数量视为销售量。
select count(*) from 销售记录表 a,库存记录表 b where a.状态=E and b.状态=用户退 and a.销售时间=统计时间 and not exists( select 1 from 销售记录表 t where t.机型=a.机型 and t.销售时间=统计时间 and t.客户姓名=a.客户姓名)
综合上面的4种情况,写出来的才是正确的。我也只考虑了上面4中情况,欢迎提出更好的方法。
-------------------------------------7.19修改----------------------------------
第三和第四种情况可以合并,只需要统计卖了又退了的数量,不用管是否还有后继操作,如再销售。
最终的报表可能是这样子的:
统计时间 门店名称 机型名称 开始库存 销售量 用户退 返厂量 退机在途 库存结余
2014-07-18 XX 三星G1 2 1 0 0 0 1(情况1)
2014-07-18 XX 三星G2 2 0 1 0 0 3(情况2)
2014-07-18 XX 三星G3 2 2 1 0 0 1(情况3)
2014-07-18 XX 三星G4 2 1 1 0 0 2(情况4)
上面的报表只是写了一部分,还得考虑退给供货商的数量,1,当天退供货商当天入库 2,当天退供货商当天没有入库。
啰啰嗦嗦写了这么多,不写了,Iteye的文本编辑器JS代码没写好,多写了几行就很卡,卡的编辑器变形了,按钮都不见了。
全文完。