2017-06-27 6 views
0

SELECTステートメントをフォーマットして、結果セットをいくつかの列に渡って出力するようにしています。SELECT、異なる列の行をIDを共有する単一の行にフォーマット

私はこのような結果セットを持っている:

ID VID PID VALUE 

1 x  1  a 
2 y  1  A 
3 y  2  B 
4 x  2  b 
5 y  3  C 
6 x  3  c 
7 x  4  d 
8 y  4  D 
9 x  5  e 
10 y  5  E 

私は効果的に単一の行に重複PID秒で値を結合する1つのSELECT文をフォーマットすることはできますか?私は実際にはPIDVALUEに興味があります。

PID VALUE1 VALUE2 

1  a  A 
2  b  B 
3  c  C 
4  d  D 
5  e  E 

そうでなければ、私は同じテーブルに作用するクエリで実際のJOIN Sを使用すべきですか?

私はCASEを使用しようとしたが、このような結果セットまで得ることができます:私はややこのようになりますを使用してい

ID VID PID VALUE1 VALUE2 

1 x  1  a  NULL 
2 y  1  NULL  A 
3 y  2  NULL  B 
4 x  2  b  NULL 
5 y  3  NULL  C 
6 x  3  c  NULL 
7 x  4  d  NULL 
8 y  4  NULL  D 
9 x  5  e  NULL 
10 y  5  NULL  E 

クエリ。

SELECT 
    ID, 
    VID, 
    PID, 
    CASE WHEN VID = 'x' THEN VALUE END VALUE1, 
    CASE WHEN VID = 'y' THEN VALUE END VALUE2 
FROM BIGTABLE 
WHERE PID IN (1, 2, 3, 4, 5) 
AND VID IN ('x', 'y') 

私はそのように全体のテーブルからそれらを選択していますので、ちょうど1-5とX & yのではないPIDVIDの値がたくさんあります。

答えて

1

このような意味ですか?これは「条件付き集計」と呼ばれています。

with 
    resultset (id, vid, pid, value) as (
     select 1, 'x', 1, 'a' from dual union all 
     select 2, 'y', 1, 'A' from dual union all 
     select 3, 'y', 2, 'B' from dual union all 
     select 4, 'x', 2, 'b' from dual union all 
     select 5, 'y', 3, 'C' from dual union all 
     select 6, 'x', 3, 'c' from dual union all 
     select 7, 'x', 4, 'd' from dual union all 
     select 8, 'y', 4, 'D' from dual union all 
     select 9, 'x', 5, 'e' from dual union all 
     select 10, 'y', 5, 'E' from dual 
    ) 
-- End of simulated resultset (for testing purposes only, not part of the solution). 
-- SQL query begins below this line. 
select pid, 
     min(case when vid = 'x' then value end) as value1, 
     min(case when vid = 'y' then value end) as value2 
from  resultset 
-- WHERE conditions, if any are needed - as in your attempt 
group by pid 
order by pid 
; 

PID VALUE1 VALUE2 
--- ------ ------ 
    1 a  A  
    2 b  B  
    3 c  C  
    4 d  D  
    5 e  E  
+0

したがって、これらのケースでは、GROUP BY句の解析/集約関数を使用する必要がありますか? 'CASE'だけを試してみたら、私は' ORA-00979:GROUP BY式ではない 'を得るでしょう。 – Eriol

+1

@Eriol - 'PID'ごとに1つの行だけが必要なので、集計したい(' GROUP BY')。集約する場合は、グループ化されていない列に対して集計関数(MI​​NやMAXやSUMなど)を使用する必要があります。条件付き集計では、ここに示すように、いくつかの値はNULLであり、MIN、MAX、SUMなどの集計関数によって無視されます。それがあなたのソリューションと私の違いです。 Oracle 11.1以降では、集約である 'PIVOT'演算子を使用できます(ただし、構文では' GROUP BY'節は使用されません)。 – mathguy

関連する問題