按情况分组,然后合并两列

时间:2019-03-09 19:24:14

标签: sql oracle

我在表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,类型分组。

我需要最终输出为

联合(category1,category2)作为category3,sum(priceA)+ sum(costA),sum(priceB)+ sum(costB),类型 要按UNION(category1 + category2)分组,键入。

(sum(priceA)+ sum(costA)会在category1中的商品与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语句吗?实际上,我称为sales的表是多个表的内部联接,因此在两个场合不单独使用select的动机(在我的实际情况下,这是表上4个select查询的并集,这使查询看起来很真实也很大)。另外,我没有创建过程的权限,因此没有PL / SQL。对于上述情况,是否有任何花哨的方法可以缩短查询时间并提高性能?

编辑-样本数据(Category1,PriceA,PriceB,Category2,CostA,CostB,类型)

+-----+----+----+-----+----+----+---+
| 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 |
+-----+----+----+---+

1 个答案:

答案 0 :(得分: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。