表Sales中有以下列:
Category1,priceA,priceB,Category2,costA,costB,type.(some items in category1 are same as category2)
sum(priceA), sum(priceB)
将按类别1,类型进行分组。
sum(costA), sum(costB)
将按类别2,类型进行分组。
我需要最终输出为
联盟(类别1,类别2)作为类别3,总和(priceA)+总和(costA),sum(priceB)+ sum(costB),要按UNION(类别1 +类别2)分类的类型,类型。
(sum(priceA)+ sum(costA)会在category1中的items与category2匹配时发生,而sum(priceB)+ sum(costB)则相同
我试着这样做
select category1,sum(priceA),sum(priceB),type group by category1,type
UNION ALL
select category2,sum(costA),sum(costB),type group by category2,type
然后用另一个总和和小组跟进。但我想知道如何在不单独选择和避免基本上2个表的并集的情况下完成它。我可以在这里使用group by case case语句吗?实际上我称为销售的表是多个表的内部联接,因此不在两个偶然事件上单独使用select的动机(在我的实际情况中,它将是表上的4个选择查询的联合,这使得查询看起来真的很棒也很大)。另外,我没有权限创建过程,所以没有PL / SQL。对于上述情况有什么奇特的方式会缩短查询并提高性能?
编辑样本数据(Category1,PriceA,PriceB,Category2,CostA,CostB,Type)
+-----+----+----+-----+----+----+---+
| AUS | 20 | 25 | UK | 35 | 40 | X |
| UK | 30 | 26 | SA | 32 | 40 | Y |
| USA | 22 | 24 | NZ | 38 | 36 | Z |
| BRA | 16 | 10 | USA | 25 | 25 | Z |
| RUS | 20 | 15 | UK | 20 | 30 | X |
+-----+----+----+-----+----+----+---+
我把它分成了两个表的联合:
+-----+----+----+---+
| AUS | 20 | 25 | X |
| UK | 30 | 26 | Y |
| USA | 22 | 24 | Z |
| BRA | 16 | 10 | Z |
| RUS | 20 | 15 | X |
+-----+----+----+---+
和
+-----+----+----+---+
| UK | 55 | 70 | X |
| SA | 33 | 40 | Y |
| NZ | 38 | 36 | Z |
| USA | 25 | 25 | Z |
+-----+----+----+---+
最终输出如下:
+-----+----+----+---+
| UK | 55 | 70 | X |
| UK | 30 | 26 | Y |
| NZ | 38 | 36 | Z |
| USA | 47 | 49 | Z |
| AUS | 20 | 25 | X |
| SA | 32 | 40 | Y |
| BRA | 16 | 10 | Z |
| RUS | 20 | 15 | X |
+-----+----+----+---+
这会给你你想要的。 SQLFiddle。
with sample_data1 as (
select "Category1", "PriceA", "PriceB", "Type"
from sample_data
union all
select "Category2", "CostA", "CostB", "Type"
from sample_data
)
select "Category1", sum("PriceA"), sum("PriceB")
from sample_data1 sd1
group by "Category1", "Type"
您必须在某个时刻拥有联合,因为您需要增加原始源表中的行数。你不能只用一个CASE来做。