Oracleの複数のレコードを1つのレコードにマージする方法について


今日、ある同級生が2つの異なる記録を1つの記録に統合してデータベースから取り出す方法、oracleデータベースを聞いた.手に入れてまず考えたのは、2つのsql文に分けて調べて、プログラムでつなぎ合わせることです.コミュニケーションを通じて発見して、同級生の需要はこのようなものではありませんて、1本のsql文に2本の記録を取得して彼らを合併することを要求して、データベース学の比較料理、上がってきて1つのとても馬鹿なsqlを書きました
select id,
(select col from table where id=t.id and flag=1)colA,
(select col from table where id=t.id and flag=2)colA
from table t where id='123'

後続の問題が出てきて、学友表の中にflagがなくて、それからROWNUMを思い出して、並べ替えた後に、前の2つの記録を手に入れて、上の照会をして、しかし学友のtableは単一の1枚の表ではありませんて、また多くの表が連合して得たので、しかも1つの記録を位置決めする時、いくつかの条件を通じてやっとできます.後でネットで調べてみると、wmsysという話が多く出てきました.wm_concat関数ですが、要求に合致しません.wmsys.wm_concatは複数の列を1つに統合し、異なるフィールドで表示する必要があります.最後に1篇の招待状を発見しましたhttp://bbs.csdn.net/topics/390691977. 大まかな考え方は,まずグループ内の番号をグループ化し,グループ内でマージする行を操作することである.ここでmax(decode(colnum,1,col 2,null);グループ化、グループ内番号付け
select col1,col2,row_number()over(partition by col1 order by col2)colnum from COL_TO_ROW

over:どんな条件の上にありますか.partition by e.deptno:部門番号別に区分(パーティション).order by e.sal desc:給与の高さから低さへのソート(rank()/dense_の使用rank()の場合、order byを持たなければなりません.そうしないと不正です.rank()/dense_rank()/row_number:文全体を階層化するという意味です.col 1,col 2を選択し、col 1の値でグループ化し、グループ内でcol 2の値で並べ、その上で番号を付けます.ではrank()とdense_rank()の違いは何ですか?rank():ジャンプソートで、2つの第1レベルがある場合、次は第3レベルです.dense_rank():連続ソートで、2つの第1レベルがある場合、次は第2レベルです.row_number():1-nから重複レコードを無視
decode      :
decode(  , 1,   1, 2,   2,... n,   n,   )

        :
IF   = 1 THEN
    RETURN(   1)
ELSIF   = 2 THEN
    RETURN(   2)
    ......
ELSIF   = n THEN
    RETURN(   n)
ELSE
    RETURN(   )
END IF
decode(        , 123

groupbyを使用する場合、selectリストに表示されるフィールドと、グループ関数に表示されていない場合はgroupby句に表示されるルールがあるからです.(selectのフィールドは単独では使用できません.group文またはグループ関数に表示する必要があります.)だからここでまたdecodeの外に関数をつけました.wmsys.wm_concatは、条件に合致する列をカンマで分割して加算します.
SQL> select id,wmsys.wm_concat(name) over (order by id) name from idtable;
 ID NAME
---------- --------------------------------------------------------------------------------
  10 ab,bc,cd
  10 ab,bc,cd
  10 ab,bc,cd
  20 ab,bc,cd,hi,ij,mn
  20 ab,bc,cd,hi,ij,mn
  20 ab,bc,cd,hi,ij,mn

上記の2つの関数は、GROUP BYに合わせて使用します.order byとgroub byが同時に現れる場合、order byの欄はgroup byに