2015-09-25 60 views
7

我有一個表像這樣的Oracle SQL查詢相結合實地百分率值

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 

所以基本上我正在尋找一種方式來繁殖反對彼此的名字形成所有可能的類別結果,這是否有意義?我一直在努力爭取一段時間,任何幫助表示讚賞!

謝謝!

編輯:可能是無限的類別,所以我正在尋找的東西,不需要引用查詢中的每個類別。

+1

所以,如果你添加一個類別「物種」,即「貓」或「狗」,你想像BlackFastCat/BlackFastDog/BlackSlowCat/BlackSlowDog/...自動?這是你編輯的意思嗎? –

+0

嗨Joachim這是正確的,它會繼續追加到組合的貓 – user3672573

+1

你怎麼知道類別的順序?爲什麼選擇「BlackFast」而不是「FastBlack」? –

回答

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 

編輯:調整中的問題描述

如果你正在尋找與類別的動態量要做到這一點,你可以用下面的查詢,它使用遞歸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 Demo

以上查詢串接的類別名稱的字母順序,b UT可以調整,通過在Categories CTE改變order by子句中的row_number()功能:

row_number() over (order by category) as seq 
+0

我認爲這可能會更好地作爲一個交叉連接,在where子句中的速度謂詞。 –

+0

我添加了一個新的查詢,應該能夠處理動態數量的類別。不知道它將在大量數據上表現如何。 – sstan

0

可以cross join來獲得期望的結果。

Fiddle with sample data

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

這將有潛在的無限類別,我需要能夠從原始表格動態引用類別的東西 – user3672573

1

這個是什麼。

  • 您加入的所有其他類別"<>"比您。

  • 但只有加入比你「大」才能避免翻轉重複。

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

我包括在選擇的類別,所以你可以驗證連接,還包括一個新的類別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 | 
+0

因此,這並沒有解決您的問題與3類? –