样本数据:
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
有没有办法达到预期的结果?
使用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
更新:
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 )
编辑:
我真的很喜欢您使用cube
的想法,以前从未使用过,如果您要处理适当的维结构化表,我认为这很酷。
不幸的是,这不是您的情况。多维数据集将尝试生成可能的总计和小计,但了解它不应该添加一些数据并不明智。
[segment_type
和promotion_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
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排序;