我有一张这样的桌子
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)
所以基本上我正在寻找一种方法来将名称相互增加以形成所有可能的类别结果,这是否有意义?一段时间以来,我一直在努力,任何帮助表示赞赏!
谢谢!
编辑:可能有无限的类别,所以我正在寻找一些不需要在查询中引用每个类别的东西.
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)
上面的查询按字母顺序连接类别名称,但您可以通过更改CTE函数中的order by子句来调整:row_number()Categories
row_number() over (order by category) as seq
Run Code Online (Sandbox Code Playgroud)