0

これは私の以前の質問の続きです。クエリからさらに詳細を取得したいので、もう一度説明すると簡単だと思います。だからここに行きます:

サンプル テーブル: (注: テーブルには、多数の異なる LOTNO を持つ 100 の ID があります)

ITEMNO LOTNO TRANS_QUAN TRANS_TYPE


 1      45        16          PO  
 1       3         2          PO  
 1      45        47          MH  
 1      45         3          MH
 1       3         8          MH

これまでのところ、ID ごとに異なる LotNo は考慮されておらず、ID と TYPE に基づいて合計されています。以下のコードは、ID = 1 で TYPE = 'PO' のすべての数量値を合計し、ID = 1 で TYPE = 'MANUAL/BACKFLUSH' で合計されたすべての数量値と比較します。これでNicholas Krasnovに):

 SELECT * 
 FROM (SELECT TR.ITEMNO
         , ROUND(SUM(TR.TRANS_QUAN * (DECODE(TR.TRANS_TYPE, 'PO', 1, 0)))) AS SUM_IN
         , ROUND(SUM(TR.TRANS_QUAN * (DECODE(TR.TRANS_TYPE, 'MANUAL/BACKFLUSH', 1,0))))AS SUM_OUT
     FROM IQMS.TRANSLOG TR
     GROUP BY IQMS.TR.ITEMNO
     ORDER BY IQMS.TR.ITEMNO)
 WHERE SUM_OUT > SUM_IN

合計計算をさらに分解して、LOTNO フィールドを組み込みたいと考えています。上記の表では、ID = 1 について、ID = 1、LotNo = 45、TYPE = PO のすべての値を合計し、それらを ID = 1、LotNo = 45、TYPE = 'MANUAL\BACKFLUSH' と比較します。

次に、(ID = 1、LOTNO = 3、TYPE = 'PO') を (ID = 1、LOTNO = 3、TYPE ='MANUAL/BACKFLUSH') などと比較します。

また、SUM_OUT > SUM_IN のレコードのみを返したい

私の出力が次のようなものになることを願っています

ID      LOTNO     SUM_IN      SUM_OUT    

 1        45        30           50
 1         3         2            8

より具体的な結果セットを得るために、これをどのように組み込むことができるかについてのアイデアはありますか?? おそらく、余分な GROUP BY か何かのような単純なもの?? 私が達成したいことを明確にしていただければ幸いです。

いつも応援ありがとうございます!:)

4

3 に答える 3

1

あなたのサンプルデータによると、それはあなたが探しているものですか?

select *
  from ( SELECT TR.ITEMNO
              , tr.lotno
              , ROUND(SUM(TR.TRANS_QUAN * (DECODE(TR.TRANS_TYPE, 'PO', 1, 0)))) AS SUM_IN
              , ROUND(SUM(TR.TRANS_QUAN * (DECODE(TR.TRANS_TYPE, 'MH', 1,0))))AS SUM_OUT
          FROM TRANSLOG TR
         GROUP BY TR.ITEMNO, tr.lotno
         ORDER BY TR.ITEMNO
       )
 where sum_out > sum_in
于 2012-09-27T14:56:18.300 に答える
1

次のクエリはあなたが望むことをすると思います。. .

select id, lotno,
       sum(case when type = 'PO' then quantity else 0 end) as sum_in,
       sum(case when type = 'MANUAL/BACKFLUSH' then quantity else 0 end) as sum_out
from IQMS.TRANSLOG TR
group by id, lotno

caseステートメントは標準 SQL です。decodeは Oracle に固有です。また、質問とコードサンプルの間で一貫性がないため、使用する列名がわかりませんでした。最短のフォームを使用しました。

のレコードを返すにはsum_out > sum_in、これをサブクエリとして埋め込むことができます。

select t.*
from (select id, lotno,
             sum(case when type = 'PO' then quantity else 0
                 end) as sum_in,
             sum(case when type = 'MANUAL/BACKFLUSH' then quantity else 0
                 end) as sum_out
      from IQMS.TRANSLOG TR
      group by id, lotno
     ) t
where sum_out > sum_in

having句を使用してこれを行うこともできます。

于 2012-09-27T14:33:39.993 に答える
0

とった!!!:) :)

SELECT *
FROM

  (SELECT TR.ITEMNO, TR.LOTNO,
       SUM(CASE WHEN TR.TRANS_TYPE = 'PO' THEN TR.TRANS_QUAN ELSE 0 END) AS SUM_IN,
       SUM(CASE WHEN TR.TRANS_TYPE = 'MANUAL/BACKFLUSH' THEN TR.TRANS_QUAN ELSE 0 END)AS SUM_OUT
   FROM IQMS.TRANSLOG TR
   GROUP BY TR.ITEMNO, TR.LOTNO
   ORDER BY TR.ITEMNO, TR.LOTNO)

WHERE SUM_OUT > SUM_IN
AND SUM_IN != '0'

皆さん、助けてくれてありがとう!!

于 2012-09-27T14:57:12.743 に答える