Oracleの複数のレコードを1つのレコードにマージする方法について
4287 ワード
今日、ある同級生が2つの異なる記録を1つの記録に統合してデータベースから取り出す方法、oracleデータベースを聞いた.手に入れてまず考えたのは、2つのsql文に分けて調べて、プログラムでつなぎ合わせることです.コミュニケーションを通じて発見して、同級生の需要はこのようなものではありませんて、1本のsql文に2本の記録を取得して彼らを合併することを要求して、データベース学の比較料理、上がってきて1つのとても馬鹿なsqlを書きました
後続の問題が出てきて、学友表の中に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);グループ化、グループ内番号付け
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から重複レコードを無視
groupbyを使用する場合、selectリストに表示されるフィールドと、グループ関数に表示されていない場合はgroupby句に表示されるルールがあるからです.(selectのフィールドは単独では使用できません.group文またはグループ関数に表示する必要があります.)だからここでまたdecodeの外に関数をつけました.wmsys.wm_concatは、条件に合致する列をカンマで分割して加算します.
上記の2つの関数は、GROUP BYに合わせて使用します.order byとgroub byが同時に現れる場合、order byの欄はgroup byに
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( , 1, 2, 3)
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に