【问题标题】:Problem with a complex query in OracleOracle中复杂查询的问题
【发布时间】:2011-05-22 03:00:37
【问题描述】:
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) 的值是多少。

有人可以建议一个 SQL 来做同样的事情或匿名块吗?

【问题讨论】:

  • 什么版本的Oracle? (我注意到旧式连接,所以想知道这是否有 8i 的附加约束)
  • Oracle 10g。代码有点老了。就是这样。

标签: sql oracle join group-by


【解决方案1】:

您可以将查询包装在另一个选择查询中,该查询将按cellkeycoupon_type 列执行摘要。

例子:

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

【讨论】:

  • 我知道这部分。我的问题是许多 cell_keys 中都有相同的 coupon_upc。因此,为每个 cell_key 单独做是有效的,但是当我尝试在 cell_key in(XX,YY) 中它会失败
【解决方案2】:

我认为您正在搜索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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2021-02-02
    • 2023-03-25
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多