oracle sql查询结合字段百分比

use*_*573 7 sql oracle

我有一张这样的桌子

NAME   CATEGORY    PERCENT
Black  Color       0.10
Blue   Color       0.30
Green  Color       0.60
Fast   Speed       0.40
Slow   Speed       0.60
Run Code Online (Sandbox Code Playgroud)

我希望输出是什么

COMBINEDCAT   COMBINEDPC
BlackFast      0.04
BlackSlow      0.06
BlueFast       0.12
BlueSlow       0.18
GreenFast      0.24
GreenSlow      0.36
Run Code Online (Sandbox Code Playgroud)

所以基本上我正在寻找一种方法来将名称相互增加以形成所有可能的类别结果,这是否有意义?一段时间以来,我一直在努力,任何帮助表示赞赏!

谢谢!

编辑:可能有无限的类别,所以我正在寻找一些不需要在查询中引用每个类别的东西.

sst*_*tan 4

select t1.Name || t2.Name as CombinedCat,
       t1.Percent * t2.Percent as CombinedPc
  from your_table t1
  join your_table t2
    on t2.Category = 'Speed'
 where t1.Category = 'Color'
 order by CombinedCat
Run Code Online (Sandbox Code Playgroud)

编辑:问题描述的调整

如果您希望对动态数量的类别执行此操作,则可以使用以下查询来执行此操作,该查询使用递归 CTE:

with Categories as (
  select category,
         row_number() over (order by category) as seq
    from your_table
   group by category),
RecursiveCTE (Name, Percent, seq) as (
  select t.Name,
         t.Percent,
         c.seq
    from your_table t
    join Categories c
      on c.category = t.category
     and c.seq = 1
   union all   
  select r.Name || t.Name as Name,
         r.Percent * t.Percent as Percent,
         c.seq
    from RecursiveCTE r
    join Categories c
      on c.seq = r.seq + 1
    join your_table t
      on t.category = c.category
)
select t.Name as CombinedCat,
       Percent as CombinedPc
  from RecursiveCTE t
 where t.seq = (select max(seq) from Categories)
order by t.Name
Run Code Online (Sandbox Code Playgroud)

SQLFiddle 演示

上面的查询按字母顺序连接类别名称,但您可以通过更改CTE函数中的order by子句来调整:row_number()Categories

row_number() over (order by category) as seq
Run Code Online (Sandbox Code Playgroud)