2010-12-08 89 views
1
SELECT a.coupon_upc,a.coup_desc,a.coup_dep,a.manuf,a.coupon_type,r.hh_red,r.red_qty, 
     r.red_val,a.coups_mailed,a.households_mailed 
FROM 

     (SELECT coupon_upc, 
       min(coupon_description) coup_desc, 
       min(campaign_manufacturer_desc) manuf, 
       min(coupon_department) coup_dep, 
       coupon_type, 
       sum(households_red) hh_red, 
       sum(coup_qty) red_qty, 
       sum(redeem_value) red_val 
      FROM lcm_eval.lcm_compare_redeemed_cell r, 
       dim_campaign c 
     WHERE r.campaign_id = c.campaign_id 
      and c.campaign_code = '&LCMXXXX' 
      and r.cell_key in (41) 
     group 
      by coupon_upc, 
       coupon_type) r, 

     (SELECT /*+ use_hash(a b c) */ 
       d.coupon_upc, 
       d.coup_desc, 
       d.manuf,d.coup_dep, 
       d.coupon_type, 
       sum(a.counts) coups_mailed, 
       sum(a.households) households_mailed 
      FROM lcm_eval.lcm_current_coupon_alloc_cell a, 
       dim_campaign c, 
       (SELECT distinct 
         coupon_upc, 
         min(coupon_description) coup_desc, 
         min(campaign_manufacturer_desc) manuf, 
         min(coupon_department) coup_dep, 
         coupon_type 
        FROM contact_coupon_details 
       WHERE schedule_key = '23' 
       group by coupon_upc,coupon_type) d 
     WHERE a.campaign_id = c.campaign_id 
      and c.campaign_code = '&LCMXXXX' code 
      and a.cell_key in (41) 
      and a.coupon_upc = d.coupon_upc 
     group by d.coupon_upc, d.coup_desc, d.manuf, d.coup_dep, d.coupon_type) a 
WHERE a.coupon_upc = r.coupon_upc (+) 
ORDER by a.coupon_type; 

我需要總結的列是(r.red_qty/a.households_mailed)。這必須出現在(cellkey,a.coupon_type)組中。即對於(cellkey,a.coupon_type)的每個組合,(r.red_qty/a.households_mailed)的值是多少。Oracle中複雜查詢的問題

有人可以建議一個單一的SQL做相同的或匿名塊的相同?

+0

甲骨文的版本? (我注意到舊式聯接,所以想知道這是否有8i的附加約束) – Harrison 2010-12-08 13:30:43

+0

Oracle 10g。代碼是一個老的。就是這樣。 – 2010-12-09 12:44:23

回答

2

您可以將查詢包裝在另一個選擇查詢中,該查詢將執行cellkeycoupon_type列的摘要。

例子:

SELECT 
    cellkey, coupon_type, SUM(red_qty)/SUM(households_mailed) summary 
FROM 
    (<select query you posted>) 
GROUP BY 
    cellkey, coupon_type 
0

我認爲你正在尋找rollup/cube

如果您想過濾掉一些您不關心的細節行,可以將其包裝在另一個選擇中。

with r as 
    (select 1 red_qty , 55 cell_key , 123 coupon_upc from dual 
     union 
     select 2 red_qty , 66 cell_key , 123 coupon_upc from dual 
     union 
     select 3 red_qty , 55 cell_key , 345 coupon_upc from dual 
     union 
     select 4 red_qty , 66 cell_key , 345 coupon_upc from dual 
     union 
     select 4 red_qty , 77 cell_key , 345 coupon_upc from dual  
     union 
     select 5 red_qty , 55 cell_key , 678 coupon_upc from dual 
     union 
     select 6 red_qty , 77 cell_key , 678 coupon_upc from dual 
     union 
     select 6 red_qty , 88 cell_key , 678 coupon_upc from dual  
     ), 
     a as(
     select 'aa' coupon_type , 50 households_mailed , 123 coupon_upc from dual 
     union 
     select 'bb' coupon_type , 100 households_mailed , 345 coupon_upc from dual 
     union 
     select 'cc' coupon_type , 200 households_mailed , 678 coupon_upc from dual 
     ) 
     select (sum(r.red_qty)/ sum(a.households_mailed)) rqty_hhmailed_ratio, 
       r.cell_key, 
        a.coupon_type 
      from r 
       inner join 
       a on r.coupon_upc = a.coupon_upc 
      group by rollup (r.cell_key, a.coupon_type) 

導致

RQTY_HHMAILED_RATIO CELL_KEY    COUPON_TYPE 
---------------------- ---------------------- ----------- 
0.02     55      aa   
0.03     55      bb   
0.025     55      cc   
0.02572857142857142857 55         
0.04     66      aa   
0.04     66      bb   
0.04     66         
0.04     77      bb   
0.03     77      cc   
0.03333333333333333333 77         
0.03     88      cc   
0.03     88         
0.031