表a: 物料名称,数量。表b:物料名称,领用数量,领用时间
请帮忙写个sql语句查出8月份之前未被领用的物料名称和数量,这个怎么写啊?

解决方案 »

  1.   

    select name,cnt from a where not exists 
    (select '1' from b where a.name=b.name and b.领用时间<8月1日)
    union all 
    select a.name,a.cnt-t.cnt from a ,
    (select name,sum(cnt) cnt from b where b.领用时间<8月1日
    group by name) t
    where a.name=t.name;
      

  2.   

    select a.name,(a.count-temp.consum) lefted from a,(select sum(usecount) consum,name from b where usedate < to_date('31-07-2007','dd-mm-yyyy') group by b.name) temp where a.name = temp.name;
      

  3.   

    Select 物料名称 From A
    Minus 
    Select 物料名称 From B Where 领用时间 < '2007-08-01'
      

  4.   

    三楼的方法可行的,我用not in 来处理也行,但是如果同时对两个表来处理的话oracle 就几乎接近死机的状态,太慢了,如果对第二个表现处理出来创建一临时表的话会很快检索,各位有更好的方法吗?
    SELECT WEBSKY.SPEC_UT_STK_TBL.ITM_CD  FROM WEBSKY.SPEC_UT_STK_TBL , WEBSKY.FACIL_TBL, WEBSKY.PROD_ITM_TBL WHERE ( WEBSKY.SPEC_UT_STK_TBL.FACIL_CD = WEBSKY.FACIL_TBL.FACIL_CD AND WEBSKY.SPEC_UT_STK_TBL.FACIL_CD = WEBSKY.FACIL_TBL.FACIL_CD AND WEBSKY.SPEC_UT_STK_TBL.ITM_CD = WEBSKY.PROD_ITM_TBL.ITM_CD ) AND ( WEBSKY.SPEC_UT_STK_TBL.FACIL_CD = 'M11' OR WEBSKY.SPEC_UT_STK_TBL.FACIL_CD = 'Z11'  ) and WEBSKY.SPEC_UT_STK_TBL.ITM_CD not in(SELECT WEBSKY.SDIN_DTL_TBL.ITM_CD  FROM WEBSKY.SDIN_DTL_TBL , WEBSKY.PROD_ITM_TBL, WEBSKY.SDIN_TBL, WEBSKY.SDOT_TBL, WEBSKY.FACIL_TBL, WEBSKY.SEC_TBL WHERE ( WEBSKY.SDIN_DTL_TBL.ITM_CD = WEBSKY.PROD_ITM_TBL.ITM_CD AND WEBSKY.SDIN_DTL_TBL.ITM_CD = WEBSKY.PROD_ITM_TBL.ITM_CD AND WEBSKY.SDIN_DTL_TBL.SDIN_NO = WEBSKY.SDIN_TBL.SDIN_NO AND WEBSKY.SDIN_DTL_TBL.SDIN_NO = WEBSKY.SDOT_TBL.SDIN_NO AND WEBSKY.SDOT_TBL.FACIL_CD = WEBSKY.FACIL_TBL.FACIL_CD AND WEBSKY.SDOT_TBL.ISS_SEC_CD = WEBSKY.SEC_TBL.SEC_CD ) AND ( (WEBSKY.SDOT_TBL.FACIL_CD = 'M11' OR WEBSKY.SDOT_TBL.FACIL_CD = 'Z11' OR WEBSKY.SDOT_TBL.FACIL_CD = 'K11') AND WEBSKY.SDIN_TBL.FACIL_CD <> 'C11' AND WEBSKY.SDIN_TBL.FACIL_CD <> 'F12' AND WEBSKY.SDOT_TBL.ISS_INS_DT >= 20070801  ) Group By WEBSKY.SDIN_DTL_TBL.ITM_CD)
      

  5.   

    这两个表好像有问题啊,看不懂你什么意思。
    表A如果是现在的库存的话,那应该是把B中8月份领的数量先汇总,再加到A中去,就行了。
    不知道有没有理解错。
    (考虑A中有重复记录)
    SELECT A.物料名称,A.数量+B.领用数量
      FROM (SELECT 物料名称,SUM(数量) FROM 表A  GROUP BY 物料名称) A,
           (SELECT 物料名称,SUM(领用数量)领用数量 
              FROM 表B 
             WHERE TO_CHAR(领用时间,'YYYYMMDD')>'20070731' GROUP BY 物料名称) B
    WHERE  A.物料名称=B.物料名称;