产品交易表A:产品    日期          数量
....
AAA     2010-01-01    100
AAA     2010-01-10    -50
BBB     2010-01-01    300
BBB     2010-01-10   -150
....我想通过一个日期范围来查询得到下面的结果:产品   期初结存    入库    出库    期末结存比如输入条件2010-1-1至2010-1-31。能够查出产品在2010-1-1前的结余数量,以及1月份出库、入库的数量,以及1月底当天还剩多少数量。

解决方案 »

  1.   

    select 产品,sum(case when 日期<'2010-01-01' then 数量 end) "月初结余",
      sum(case when 日期 between '2010-01-01' and '2010-01-31' and 数量<0 then 数量 end)"出库",
      sum(case when 日期 between '2010-01-01' and '2010-01-31' and 数量>0 then 数量 end)"入库",
      sum(数量)"月底数"
    from table1
    where 日期<='2010-01-31'
    group by 产品
      

  2.   

    SELECT b.产品, b.结余, a.入库, a.出库, b.结余 + a.入库 - a.出库 剩余数量
      FROM (SELECT 产品,
                   SUM(CASE WHEN 数量 > 0 THEN 数量 ELSE 0 END) 入库,
                   SUM(CASE WHEN 数量 < 0 THEN 数量 ELSE 0 END) 出库
              FROM 交易表A
             WHERE 日期 BETWEEN DATE '2010-1-1' AND DATE DATE '2010-1-31' + 1
             GROUP BY 产品) a,
           (SELECT 产品, SUM(数量) 结余 FROM 交易表A WHERE 日期 < DATE '2010-1-1' GROUP BY 产品) b
     WHERE a.产品(+) = b.产品;
      

  3.   

    WHERE 日期 BETWEEN DATE '2010-1-1' AND DATE DATE '2010-1-31' + 1
    上面这行多了一个DATE
      

  4.   

    高手果然多啊,顺便问一下如果在水晶报表里实现该怎么个做法?(不用SQL命令的方式)
      

  5.   

    呵呵,一句话就能解决问题,其实sql功能是相当强大的,只要灵活运用好,基本都能解决!
      

  6.   

    水晶报表查询表数据的时候,调用一下上面那个sql,把结果弄进去显示就完了。
      

  7.   


    我是说不用SQL命令的方式,应该也有办法的吧
      

  8.   

    好像是SQL Server的写法,Oracle通不过。
      

  9.   

    SELECT 产品,
                   SUM(CASE WHEN 数量 > 0 THEN 数量 ELSE 0 END) 入库,
                   SUM(CASE WHEN 数量 < 0 THEN 数量 ELSE 0 END) 出库
              FROM 交易表A
             WHERE to_char(日期,'yyyy-mm-dd') >= '2010-01-01' and to_char(日期,'yyyy-mm-dd') <= '2010-01-31' GROUP BY 产品) a,
           (SELECT 产品, SUM(数量) 结余 FROM 交易表A 
    WHERE to_char(日期,'yyyy-mm-dd') > '2010-1-1' GROUP BY 产品