2017-10-10 29 views
0

此查詢的目的是爲「相同」類型的項目的四種不同變體計算每個唯一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 D000'開始,而不是'FROM L2000.ITEM_CARRIER WHERE ROWNUM = 1'。 –

+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

工作很好,我也找到了逗號。謝謝!! –