我有一个这样的表
NAME CATEGORY PERCENT
Black Color 0.10
Blue Color 0.30
Green Color 0.60
Fast Speed 0.40
Slow Speed 0.60
我想要的输出是
COMBINEDCAT COMBINEDPC
BlackFast 0.04
BlackSlow 0.06
BlueFast 0.12
BlueSlow 0.18
GreenFast 0.24
GreenSlow 0.36
所以本质上我在寻找一种方法将这些名字相乘来形成所有可能的分类结果,这有意义吗?我已经为此挣扎了一段时间,任何帮助都是感激的!
谢谢!
编辑:可能有无限的类别,所以我正在寻找一些不需要在查询中引用每个类别的东西。
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
编辑:调整问题描述
如果您希望对动态数量的类别执行此操作,可以使用以下查询,该查询使用递归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
SQLFiddle演示上面的查询按字母顺序连接类别名称,但是您可以通过更改Categories
CTE中row_number()
函数中的order by
子句来进行调整:
row_number() over (order by category) as seq
这个怎么样
-
您加入了除您以外的所有
"<>"
类别。 -
但只加入比你"大"的,以避免反向重复。
.
SELECT
T1."CATEGORY",
T2."CATEGORY",
T1."NAME"||T2."NAME" as "COMBINEDCAT",
T1."PERCENT"*T2."PERCENT" as "COMBINEDPC"
FROM Table1 T1
INNER JOIN Table1 T2
ON T1."CATEGORY" < T2."CATEGORY"
ORDER BY T1."CATEGORY", T2."CATEGORY", T1."NAME"||T2."NAME"
SQL Fiddle Demo
我在select中包含了类别,这样你就可以验证连接,还包含了一个新的类别COST
| CATEGORY | CATEGORY | COMBINEDCAT | COMBINEDPC |
|----------|----------|-------------|------------|
| Color | Cost | BlackCheap | 0.03 |
| Color | Cost | BlackHigh | 0.04 |
| Color | Cost | BlackLow | 0.03 |
| Color | Cost | BlueCheap | 0.09 |
| Color | Cost | BlueHigh | 0.12 |
| Color | Cost | BlueLow | 0.09 |
| Color | Cost | GreenCheap | 0.18 |
| Color | Cost | GreenHigh | 0.24 |
| Color | Cost | GreenLow | 0.18 |
| Color | Speed | BlackFast | 0.04 |
| Color | Speed | BlackSlow | 0.06 |
| Color | Speed | BlueFast | 0.12 |
| Color | Speed | BlueSlow | 0.18 |
| Color | Speed | GreenFast | 0.24 |
| Color | Speed | GreenSlow | 0.36 |
| Cost | Speed | CheapFast | 0.12 |
| Cost | Speed | CheapSlow | 0.18 |
| Cost | Speed | HighFast | 0.16 |
| Cost | Speed | HighSlow | 0.24 |
| Cost | Speed | LowFast | 0.12 |
| Cost | Speed | LowSlow | 0.18 |
您可以cross join
以获得所需的结果。
修改样本数据
select
n.name||s.name as combinedcat,
n.percent*s.percent
from (select distinct name, percent from tablename where category = 'Color') n
cross join (select distinct name, percent from tablename where category = 'Speed') s