Oracle-按多维数据集分组-按不同列求和

问题描述 投票:5回答:3

样本数据:

product_type |segment_type  |promotion_id  |promotion_value
-----------------------------------------------------------
Beer         |Regional      |1             |20
Beer         |National      |1             |20
Beer         |Regional      |2             |20
Beer         |National      |2             |20
Beer         |National      |3             |30
Beer         |Regional      |4             |40
Soda         |Regional      |5             |50
Soda         |National      |5             |50
Soda         |Regional      |6             |50
Soda         |National      |6             |50
Soda         |National      |7             |15
Soda         |Regional      |8             |20

目标:获取考虑了不同促销的按product_type和segment_type(多维数据集)分组的促销总价值。请注意,一次促销可以同时覆盖一个或两个细分市场(区域和国家/地区)。

所需结果:

product_type   |segment_type    |promotion_value
-------------------------------------------------
Beer           |                |110
Beer           |Regional        |80
Beer           |National        |70
Soda           |                |135
Soda           |Regional        |120
Soda           |National        |115

我当前的SQL如下:

SELECT product_Type,
       segment_type,
       sum(promotion_value)promotion_value
  from sample_data
 group by product_type,
          cube(segment_type)

当前结果是:

product_type   |segment_type    |promotion_value
-------------------------------------------------
Beer           |                |150
Beer           |Regional        |80
Beer           |National        |70
Soda           |                |235
Soda           |Regional        |120
Soda           |National        |115

SQLFiddle:link

有没有办法达到预期的结果?

sql oracle group-by distinct cube
3个回答
0
投票

使用Sum(Distinct..)获得组中唯一值的总和

SELECT product_Type,
       segment_type,
       sum(distinct promotion_value)promotion_value
  from sample_data
 group by product_type,
          cube(segment_type)
          order by product_type

SQLFIDDLE DEMO

更新:

SELECT product_Type,
       segment_type,
       Sum(DISTINCT promotion_value)
FROM   (SELECT product_Type,
               segment_type,
               Sum(promotion_value) promotion_value
        FROM   sample_data
        GROUP  BY product_type,
                  segment_type) a
GROUP  BY product_type,
          cube( segment_type ) 

SQLFIDDLE DEMO


0
投票

编辑:

我真的很喜欢您使用cube的想法,以前从未使用过,如果您要处理适当的维结构化表,我认为这很酷。

不幸的是,这不是您的情况。多维数据集将尝试生成可能的总计和小计,但了解它不应该添加一些数据并不明智。

[segment_typepromotion_id似乎是多对多关系,通常这不是问题,但是无法通过cube扩展名自动处理。

因此,为了安全起见,最后我认为最好的解决方案是创建两个查询以正确聚合您的数据:

   select product_Type, 
          segment_type,
          sum(promotion_value) promotion_value
     from sample_data
 group by product_type,
          segment_type
union all
   select product_Type, 
          null,
          sum(promotion_value) promotion_value
     from (
            select distinct product_Type,
                   promotion_id,
                   promotion_value
              from sample_data
          )
 group by product_type
 order by product_type

Demo in SQLFiddle


0
投票

select product_type,''作为segment_type,sum(promotion_value)作为Promotion_value来自stack_sam按product_type分组联盟选择product_type,segment_type,sum(promotion_value)来自stack_sam按product_type,segment_type分组按1排序;

© www.soinside.com 2019 - 2024. All rights reserved.