2015-09-25 10 views
7

は、私は、そのような私は出力になりたい何このオラクルの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

だからもし新しいカテゴリを含め、あなたが参加し検証することができます選択上のカテゴリを含めます「Cat」または「Dog」というカテゴリの「Species」が追加されました。 BlackFastCat/BlackFastDog/BlackSlowCat/BlackSlowDog/...のようなものが自動的に表示されますか?それが編集の意味ですか? –

+0

こんにちはJoachimは、それがcombinedcatに追加し続けるだろう – user3672573

+1

カテゴリの順序をどのように知っていますか?なぜ "BlackBast"ではなく "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 

EDIT:問題の説明で調整

あなたがカテゴリの動的な量でこれを行うために探している場合は、再帰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、アルファベット順にカテゴリ名を連結し

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

私は、where節のスピードに関する述語を使って、十字結合として良くなると思います。 –

+0

私は動的な数のカテゴリを扱うことができるはずの新しいクエリを追加しました。しかし、大量のデータに対してどれくらいうまく実行されるかはわかりません。 – sstan

0

あなたができるcross join望ましい結果を得るために:あなたはCategories CTEでrow_number()機能でorder by句を変更していることを調整することができますユタ。これについて

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

何。

  • 他のすべてのカテゴリ"<>"に参加してください。

  • しかし、重複を逆転させないようにするには、「より大きい」ものと結合するだけです。

SQL Fiddle Demo

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" 
は、私はまた、 COST

OUTPUT

| 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つのカテゴリであなたの問題を解決しませんでしたか? –

関連する問題