本帖最后由 tsunekou 于 2011-10-28 08:19:02 编辑

解决方案 »

  1.   

    楼主提问中没有描述当数量不为1的情况怎么计算,假设存在以下数据
    A1 在用 2 001
    A1 停用 1 002
    那么结果是什么?我在此假设结果是
    A1 在用 1 001
    通过以下语句可以达到楼主需求--WLH物料号 ZT使用状态 SL使用数量 LSH流水号
    with t as (
    select 'A1' WLH, '在用' ZT, 1 SL, '001' LSH from dual union
    select 'A2', '在用', 1, '001' from dual union
    select 'A3', '在用', 1, '001' from dual union
    select 'A1', '停用', 1, '002' from dual union
    select 'A3', '停用', 1, '003' from dual union
    select 'A1', '在用', 1, '003' from dual union
    select 'A4', '在用', 1, '003' from dual )
    --上面是测试模拟数据,使用时不要引用
    SELECT * 
    FROM 
      (SELECT WM_CONCAT(WLH),SUM(XJ) 
        FROM (SELECT WLH,SUM(SL * DECODE(ZT,'在用',1,-1)) XJ FROM T GROUP BY WLH)
       WHERE XJ > 0),
      (SELECT MAX(LSH) FROM T);
      

  2.   

    或者通过以下SQL也可以,下面的SQL可以减少一个子查询
    SELECT * 
    FROM 
      (SELECT WM_CONCAT(WLH),SUM(XJ),MAX(MLSH)
        FROM (SELECT WLH,SUM(SL * DECODE(ZT,'在用',1,-1)) XJ,MAX(LSH) MLSH FROM T GROUP BY WLH)
       WHERE XJ > 0);
      

  3.   


    SQL> WITH t AS (
      2  SELECT 'A1' materiel_no, '在用' status, 1 amount, '001' seq FROM DUAL UNION ALL
      3  SELECT 'A2', '在用', 1, '001' FROM DUAL UNION ALL
      4  SELECT 'A3', '在用', 1, '001' FROM DUAL UNION ALL
      5  SELECT 'A1', '停用', 1, '002' FROM DUAL UNION ALL
      6  SELECT 'A3', '停用', 1, '003' FROM DUAL UNION ALL
      7  SELECT 'A1', '在用', 1, '003' FROM DUAL UNION ALL
      8  SELECT 'A4', '在用', 1, '003' FROM DUAL
      9  )
     10  SELECT SUBSTR(SYS_CONNECT_BY_PATH(n.materiel_no, ','), 2) materiel_no,
     11         n.status,
     12         n.amount,
     13         n.seq
     14    FROM (SELECT m.materiel_no,
     15                 m.status,
     16                 SUM(m.amount) OVER() amount,
     17                 m.seq,
     18                 ROWNUM rowno
     19            FROM (SELECT t.*,
     20                         ROW_NUMBER() OVER(PARTITION BY t.materiel_no ORDER BY t.seq DESC) rn
     21                    FROM t) m
     22           WHERE m.rn = 1
     23             AND m.status = '在用') n
     24   WHERE CONNECT_BY_ISLEAF = 1
     25   START WITH n.rowno = 1
     26  CONNECT BY PRIOR n.rowno = n.rowno - 1
     27         AND PRIOR n.status = n.status
     28  ;MATERIEL_NO                                                                      STATUS     AMOUNT SEQ
    -------------------------------------------------------------------------------- ------ ---------- ---
    A1,A2,A4                                                                         在用            3 003
      

  4.   

    相较之下还是xiaobn_cn君的思路简单 也谢谢hudingchen君的参与 结贴了
      

  5.   

    WM_CONCAT的确方便,但是WM_CONCAT是undocumented的东西,以后可能不被支持,我一般不使用。如果自己学习就无所谓了~~~