逐个案例条件,然后是两列的并集

问题描述 投票:0回答:1

表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 |
+-----+----+----+---+
sql oracle
1个回答
0
投票

这会给你你想要的。 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来做。

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