1

タイトル失礼します。ちょっとややこしいかも!私が使用しているサンプルテーブルを以下に示します。

     ID         Quantity         Type
 -----------------------------------------------
     1             14             PO
     1              2             PO  
     1              4             MH  
     1              3             MH
     1              2             MH
     2             16             PO
     2             12             MH
     2              9             MH

これが私がやりたいことです。ID = 1 および Type = PO (14 + 2) のすべての数量を SUM_IN として合計したいと考えています。次に、ID = 1 と Type = MH (4 + 3 + 2) のすべての数量を SUM_OUT として合計します。これが完了したら、2 つを比較して、SUM_OUT > SUM_IN の場合にのみ値を返します。したがって、(12 + 9) > 16 であるため、ID = 1 の場合は返されませんが、ID = 2 の場合は返されます。

SQLでこれを行う方法はありますか、またはタスクにPL/SQLと変数を使用する必要がありますか? 私は PL/SQL の経験がほとんどありませんが、論理的には変数が問題を解決する最も簡単な方法であるように思われます。select ステートメントを変数に格納できることは知っていますが、その方法がわかりません。とにかく、ここに私の2つのSQL選択があります

  SELECT SUM(QUANTITY) AS SUM_IN
  FROM TRANSLOG
  WHERE TYPE IN ('PO')
  AND ID = '1'

  SELECT SUM(QUANTITY) AS SUM_OUT
  FROM TRANSLOG
  WHERE TYPE IN ('MH')
  AND ID = '1'

したがって、これらの両方を変数に設定できれば、タスクはそれほど難しくないはずですよね???

助けてくれてありがとう。

4

3 に答える 3

2
select ID, 
    sum ( Quantity * case Type when 'po' then 1 else 0 end ) as SUM_IN,
    sum ( Quantity * case Type when 'mh' then 1 else 0 end ) as SUM_OUT
from translog
group by ID
having sum ( Quantity * case Type when 'po' then 1 else -1 end ) < 0
于 2012-09-27T08:31:42.463 に答える
1
SELECT CASE WHEN b.SUM_OUT > a.SUM_IN then b.SUM_OUT else '' END as SUM_OUT,
       CASE WHEN b.SUM_OUT > a.SUM_IN then a.SUM_IN else '' END as SUM_IN
FROM

(SELECT ID,SUM(QUANTITY) AS SUM_IN
FROM TRANSLOG
WHERE TYPE IN ('PO')
AND ID = '1'
GROUP BY ID,Type
) a

INNER JOIN 

(SELECT ID,SUM(QUANTITY) AS SUM_OUT
FROM TRANSLOG
WHERE TYPE IN ('MH')
AND ID = '1'
GROUP BY ID,Type
) b

ON a.ID=b.ID
于 2012-09-27T08:37:20.997 に答える
1

タグで質問にplsqlタグを付けたので、クエリを実行するRDBMSはOracleであると想定しています。その場合、必要な結果セットを取得する別の方法 ( DECODE関数を使用) を次に示します。

select *
  from (select id
             , sum(Quantity*decode(tp, 'PO', 1, 0)) as sum_in
             , sum(Quantity*decode(tp, 'MH', 1, 0)) as sum_out
         from t1
        group by id
        order by id  )
 where sum_out > sum_in

結果:

ID    SUM_IN    SUM_OUT
-----------------------
 2     16        21

残りの列を とともに表示する場合はsum_insum_out次のクエリが便利です。

select id
     , quantity
     , Tp
     , sum_in
     , sum_out
  from (select id
             , quantity
             , tp
             , sum(Quantity*decode(tp, 'PO', 1, 0)) over(partition by id) as sum_in
             , sum(Quantity*decode(tp, 'MH', 1, 0)) over(partition by id) as sum_out
         from t1
       )
 where sum_out > sum_in

結果:

Id    Quantity    Tp    Sum_In    Sum_Out 
---------------------------------------------
2      16         PO     16        21 
2      12         MH     16        21 
2      9          MH     16        21 
于 2012-09-27T09:45:06.550 に答える