我有3个表
表1 材料表,结构是
商品名称  单位  单价  供应商
A          PCS   10     A
B          PCS   20     B
......
表2 入库表,结构是
商品名称  单位  单价    数量   时间         期数
A          PCS   10     20    2008-08-30   200808
B          PCS   20     30    2008-07-30   200807
B          PCS   20     10    2008-08-30   200808
......
表表3 出库表,结构是
商品名称  单位  单价   数量    时间         期数
A          PCS   10     10    2008-08-30   200808
B          PCS   20     15    2008-08-20   200808
B          PCS   20     5     2008-07-30   200807........
提问:
如何用1条sql语句实现
条件:按照期数(如200808期)进行汇总,期初数是200807期 收入数-发出数商品名称  单位  单价     期初数        本期收入数   本期发出数   结余
A          PCS   10        0               20         10         10
B          PCS   10        25              10         15         20另外就是按照时间段(开始时间2008-8-1,结束时间2008-8-31)进行汇总,效果如下:商品名称  单位  单价     时间段前余数   时间段内收入数   时间段内发出数   目前结余数
A          PCS   10           0               20               10            10
B          PCS   10          25               10               15            20
谢谢!请各位大侠不吝赐教

解决方案 »

  1.   

    链表 在分组目前头晕ing 
      

  2.   

    基本思路 建个视图
    CREATE VIEW view1 
    AS 
    (select r.期数 ,sum(单价*数量) as 汇总,r.商品名称 from  入库表 r  group by r.期数 ,r.商品名称 ) union all (select c.期数  ,-sum(单价*数量) as 汇总,c.商品名称 from  出库表 c  group by c.期数 ,c.商品名称) 然后根据要求
    select 商品名称, (select 汇总 from view1 where 期数=aa.期数 and 汇总>0) as 进货,(select 汇总 from view1 where 期数=aa.期数 and 汇总 <0) as 出货,(select sum(汇总) from view1 v where cast(v.期数 as int) <=cast(v.期数 as int) and v.商品名称=aa.商品名称) as 结存  from view1 aa group by aa.期数 ,aa.商品名称 order by aa.期数
      

  3.   

    另外就是按照时间段(开始时间2008-8-1,结束时间2008-8-31)进行汇总,效果如下: 商品名称  单位  单价    时间段前余数  时间段内收入数  时间段内发出数  目前结余数 
    A          PCS  10          0              20              10            10 
    B          PCS  10          25              10              15            20 我试着写得,不对的话请参考吧select CL.商品名称, CL.单位, CL.单价, 
           case RK0.数量 when null then 0 else RK0.数量 - case CK0.数量 when null then 0 else CK0.数量 end end as 时间段前余数,
           case RK1.数量 when null then 0 else RK1.数量 end as 时间段内收入数,
           case CK1.数量 when null then 0 else CK1.数量 end as 时间段内发出数,
           时间段前余数 + 时间段内收入数 - 时间段内发出数 as 目前结余数
    from (select 商品名称, sum(数量) as 数量  from 入库表 where 期数 = '本期数' group by 商品名称) RK1
    full outer join (select 商品名称, sum(数量) as 数量  from 入库表 where 期数 = '上期数' group by 商品名称) RK0 
    on RK0.商品名称 = RK1.商品名称
    full outer join (select 商品名称, sum(数量) as 数量  from 出库表 where 期数 = '本期数' group by 商品名称) CK1
    on CK1.商品名称 = RK1.商品名称
    full outer join (select 商品名称, sum(数量) as 数量  from 出库表 where 期数 = '上期数' group by 商品名称) CK0 
    on CK0.商品名称 = CK1.商品名称
    full outer join (select * from 材料表)  CL on CL.商品名称 = CK0.商品名称