2017-10-10 15 views
0

このquerysの目的は、アイテムの「同じ」タイプの4つの異なるバリアントの各一意のID(LUID_NO)を数えることです。 期待どおりに動作します。
私の質問には、このクエリを簡略化したり別の方法で書いたりできますか?
私はそれを見ると、はるかに簡単な方法でそれを書くことはおそらく可能であるという感覚を揺さぶることはできません。SQLを簡略化することは可能ですか?

SELECT 
    (SELECT COUNT(DISTINCT ICL.LUID_NO) 
      FROM  L2000.ITEM_CARRIER IC 
      INNER JOIN L2000.ITEM_UNITS_DEFINITION IUD ON IUD.PV_ID=IC.PV_ID AND IUD.STORER_ID=IC.STORER_ID AND IUD.ITEM_ID=IC.ITEM_ID 
      INNER JOIN L2000.ITEM_CARRIER_LUID ICL ON ICL.ITEM_CARRIER_NO=IC.ITEM_CARRIER_NO 
      INNER JOIN L2000.ITEM_PROPERTY IP ON IC.PROPERTY_INDEX=IP.PROPERTY_INDEX 
      INNER JOIN L2000.ITEM I ON I.ITEM_ID = IC.ITEM_ID AND I.STORER_ID = IC.STORER_ID 
        WHERE  IC.PV_ID = 'B2' 
        AND  IP.BLOCK_CODE IS NULL 
        AND  IUD.UOM_QTY = ICL.PHYSIC_QTY 
        AND  IUD.UNIT_DEF_ID = 'LU' 
        AND  IC.STORER_ID = 'PG' 
        AND  ICL.PHYSIC_QTY > 0 
        AND  I.ITEM_DESC LIKE '#%' 
        AND  I.ITEM_GROUP_ID IN ('BABYCARE','FEMCARE') 
    )AS B2_PALLETS, 
    (SELECT COUNT(DISTINCT ICL.LUID_NO) 
      FROM  L2000.ITEM_CARRIER IC 
      INNER JOIN L2000.ITEM_UNITS_DEFINITION IUD ON IUD.PV_ID=IC.PV_ID AND IUD.STORER_ID=IC.STORER_ID AND IUD.ITEM_ID=IC.ITEM_ID 
      INNER JOIN L2000.ITEM_CARRIER_LUID ICL ON ICL.ITEM_CARRIER_NO=IC.ITEM_CARRIER_NO 
      INNER JOIN L2000.ITEM_PROPERTY IP ON IC.PROPERTY_INDEX=IP.PROPERTY_INDEX 
      INNER JOIN L2000.ITEM I ON I.ITEM_ID = IC.ITEM_ID AND I.STORER_ID = IC.STORER_ID 
        WHERE IC.PV_ID = 'B3' 
        AND  IP.BLOCK_CODE IS NULL 
        AND  IUD.UOM_QTY = ICL.PHYSIC_QTY 
        AND  IUD.UNIT_DEF_ID = 'LU' 
        AND  IC.STORER_ID = 'PG' 
        AND  ICL.PHYSIC_QTY > 0 
        AND  I.ITEM_DESC LIKE '#%' 
        AND  I.ITEM_GROUP_ID IN ('BABYCARE','FEMCARE') 
    )AS B3_PALLETS, 
    (SELECT COUNT(DISTINCT ICL.LUID_NO) 
      FROM  L2000.ITEM_CARRIER IC 
      INNER JOIN L2000.ITEM_UNITS_DEFINITION IUD ON IUD.PV_ID=IC.PV_ID AND IUD.STORER_ID=IC.STORER_ID AND IUD.ITEM_ID=IC.ITEM_ID 
      INNER JOIN L2000.ITEM_CARRIER_LUID ICL ON ICL.ITEM_CARRIER_NO=IC.ITEM_CARRIER_NO 
      INNER JOIN L2000.ITEM_PROPERTY IP ON IC.PROPERTY_INDEX=IP.PROPERTY_INDEX 
      INNER JOIN L2000.ITEM I ON I.ITEM_ID = IC.ITEM_ID AND I.STORER_ID = IC.STORER_ID 
        WHERE IC.PV_ID = 'B2' 
        AND  IP.BLOCK_CODE IS NOT NULL 
        AND  IUD.UNIT_DEF_ID = 'LU' 
        AND  IC.STORER_ID = 'PG' 
        AND  ICL.PHYSIC_QTY > 0 
        AND  I.ITEM_DESC LIKE '#%' 
        AND  I.ITEM_GROUP_ID IN ('BABYCARE','FEMCARE') 
    )AS BLOCKED_B2_PALLETS, 
    (SELECT COUNT(DISTINCT ICL.LUID_NO) 
      FROM  L2000.ITEM_CARRIER IC 
      INNER JOIN L2000.ITEM_UNITS_DEFINITION IUD ON IUD.PV_ID=IC.PV_ID AND IUD.STORER_ID=IC.STORER_ID AND IUD.ITEM_ID=IC.ITEM_ID 
      INNER JOIN L2000.ITEM_CARRIER_LUID ICL ON ICL.ITEM_CARRIER_NO=IC.ITEM_CARRIER_NO 
      INNER JOIN L2000.ITEM_PROPERTY IP ON IC.PROPERTY_INDEX=IP.PROPERTY_INDEX 
      INNER JOIN L2000.ITEM I ON I.ITEM_ID = IC.ITEM_ID AND I.STORER_ID = IC.STORER_ID 
        WHERE IC.PV_ID = 'B3' 
        AND  IP.BLOCK_CODE IS NOT NULL 
        AND  IUD.UNIT_DEF_ID = 'LU' 
        AND  IC.STORER_ID = 'PG' 
        AND  ICL.PHYSIC_QTY > 0 
        AND  I.ITEM_DESC LIKE '#%' 
        AND  I.ITEM_GROUP_ID IN ('BABYCARE','FEMCARE') 
    )AS BLOCKED_B3_PALLETS 

FROM L2000.ITEM_CARRIER 
WHERE ROWNUM = 1 
+0

サブクエリをスキップし、左の代わりに参加します。また、条件式を使用して条件付き集計を行うこともできます。 – jarlh

+0

サブクエリはメインクエリとは関係ないので、 'FROM L2000.ITEM_CARRIER WHERE ROWNUM = 1'の代わりに、' FROM DUAL'を開始することもできます。 –

+0

'ITEM_ID'に' ITEM'と 'ITEM_CARRIER'と' ITEM_UNITS_DEFINITION'を参加させます。なぜITEM_PROPERTYでもいいのですか?そのテーブルは 'ITEM_ID'を持っていませんか?テーブルがどのように関連しているかを示して説明すると、役立つでしょう。例えばPV_IDとは何ですか? –

答えて

3

使用条件集約

SELECT COUNT(DISTINCT CASE WHEN IC.PV_ID = 'B2' 
       AND  IP.BLOCK_CODE IS NULL THEN ICL.LUID_NO END) AS B2_PALLETS, 
     COUNT(DISTINCT CASE WHEN IC.PV_ID = 'B3' 
       AND  IP.BLOCK_CODE IS NULL THEN ICL.LUID_NO END) AS B3_PALLETS, 
     COUNT(DISTINCT CASE WHEN IC.PV_ID = 'B2' 
       AND  IP.BLOCK_CODE IS NOT NULL THEN ICL.LUID_NO END) AS BLOCKED_B2_PALLETS, 
     COUNT(DISTINCT CASE WHEN IC.PV_ID = 'B3' 
       AND  IP.BLOCK_CODE IS NOT NULL THEN ICL.LUID_NO END) AS BLOCKED_B3_PALLETS 
     FROM  L2000.ITEM_CARRIER IC 
     INNER JOIN L2000.ITEM_UNITS_DEFINITION IUD ON IUD.PV_ID=IC.PV_ID AND IUD.STORER_ID=IC.STORER_ID AND IUD.ITEM_ID=IC.ITEM_ID 
     INNER JOIN L2000.ITEM_CARRIER_LUID ICL ON ICL.ITEM_CARRIER_NO=IC.ITEM_CARRIER_NO 
     INNER JOIN L2000.ITEM_PROPERTY IP ON IC.PROPERTY_INDEX=IP.PROPERTY_INDEX 
     INNER JOIN L2000.ITEM I ON I.ITEM_ID = IC.ITEM_ID AND I.STORER_ID = IC.STORER_ID 
       WHERE IUD.UOM_QTY = ICL.PHYSIC_QTY 
       AND  IUD.UNIT_DEF_ID = 'LU' 
       AND  IC.STORER_ID = 'PG' 
       AND  ICL.PHYSIC_QTY > 0 
       AND  I.ITEM_DESC LIKE '#%' 
       AND  I.ITEM_GROUP_ID IN ('BABYCARE','FEMCARE') 
+0

これは正しく見えますが、私はそれを実行している "行方不明"を取得します。私は余分なカンマまたは同様のものと思われるエラーを見つけることができないようですか? –

+0

@ChristofferTrabjerg私は余分なカンマを持っていました。やってみよう。 –

+0

偉大な働き者、コンマも見つけました。ありがとう!! –

関連する問題