2016-10-27 21 views
0

以下の問合せを書き込みましたが、集計はケース・ステートメントの前に行う必要があるため、これを構造化する最良の方法についてのアドバイスが大好きです。複雑なケース・ステートメントの問題 - Oracle SQL

Select Store, CUSTID, CUST.ID_CUST, 

Sum(
    CASE 
    WHEN Cust_Gift.Code_Status = 'C' AND Gift_Item.FLAG_STORE_LOC = 'N' 
    THEN Cust_Gift.AMT_PAID ELSE 0 
    END) GiftAmt, 

Sum(
    CASE WHEN Cust_Gift.Code_Status = 'C' AND Gift_Item.FLAG_STORE_LOC = 'Y' 
    THEN Cust_Gift.AMT ELSE 0 
    END) CustGiftAmt, 

Sum(
    CASE WHEN Cust_Coupon.Code_Status = 'C' 
    THEN Cust_Coupon.AMT 
    ELSE 0 
    END) CouponAmt, 

Sum(CASE WHEN Cust_Sports.Status = 'C' 
    THEN Cust_Sports.AMT 
    ELSE 0 
END) SportsAmt 

FROM CUST 
    LEFT OUTER JOIN CUST_GIFT 
    ON CUST.ID_CUST = CUST_GIFT.ID_CUST 
    LEFT OUTER JOIN CUST_COUPON 
    ON CUST.ID_CUST = CUST_COUPON.ID_CUST 
    LEFT OUTER JOIN CUST_SPORTS 
    ON CUST.ID_CUST = CUST_SPORTS.ID_CUST 
    INNER JOIN GIFT_ITEM 
    ON CUST_GIFT.ID_GIFT_ITEM = GIFT_ITEM.ID_GIFT_ITEM 

WHERE (STORE = 'M669098' OR STORE = 'M66923434') 

Group by CustID, Store, CUST.ID_CUST 
+3

あなたの加入が行数を乗算しています。ジョインを行う前に*集計する必要があります。 –

+2

サブクエリ内で集計を行い、この結果を元のクエリに戻すことができます。 –

+0

GIFT_ITEMへの参加を取り除くとあなたはうまくいく – cha

答えて

2

これは、あなたがそれを行うことができ一つの方法である:

SELECT cust.store, 
     cust.custid, 
     cust.id_cust, 
     gift.giftamt, 
     gift.custgift, 
     cpn.couponamt, 
     sprt.sportsamt 
FROM cust 
     LEFT OUTER JOIN (SELECT id_cust, 
           SUM(CASE WHEN cg.code_status = 'C' AND gi.flag_store_loc = 'N' THEN cg.amt_paid END) giftamt, 
           SUM(CASE WHEN cg.code_status = 'C' AND gi.flag_store_loc = 'Y' THEN cg.amt_paid END) custgiftamt 
         FROM cust_gift cg 
           INNER JOIN gift_item gi ON cg.id_gift_item = gi.id_gift_item) gift ON cust.id_cust = gift.id_cust 
     LEFT OUTER JOIN (SELECT id_cust, 
           SUM(CASE WHEN code_status = 'C' THEN amt END) couponamt 
         FROM cust_coupon) cpn ON cust.id_cust = cpn.id_cust 
     LEFT OUTER JOIN (SELECT id_cust, 
           SUM(CASE WHEN status = 'C' THEN amt END) sportsamt 
         FROM cust_sports) sprt ON cust.id_cust = sprt.id_cust 
WHERE (STORE = 'M669098' OR STORE = 'M66923434'); 
+0

行のために(CASE WHEN code_status = 'C' AND flag_store_loc = 'Y' THEN amt_paid END)custgiftamt FROM cust_gift cg) - これらの2つのフィールドは異なるテーブルからのものですが、 1つの結合ステートメントを持つ。両方のフィールドにフラグを立てるために、2つの異なる結合ステートメントをどのように含めるのですか(code_statusとflag_store_loc) – Danimov82

+0

ああ、申し訳ありませんが、私はそれを逃しました。その余分な結合条件に基づいて別の外部結合を作成し、クーポン/スポーツサブクエリ結合に似た合計を行います – Boneist

+0

明日はオフィスに戻ってきます。 2つのギフトテーブルの関係はどうですか?あなたの参加条件に基づいて、それは1対1か1対多ですか? – Boneist

関連する問題