2016-12-30 10 views
0

2列のCSVファイルがあります。複数の行の値を複数の列に取得するクエリ

Empid | SID 
:-----|-----: 
12312 | S-1-5-21-3751615294 
12312 | S-1-5-21-3751615298 
12312 | S-1-5-21-3751615292 
12313 | S-1-5-21-3751615294-5078 
13546 | S-1-5-21-3751615294-50725 
12312 | S-1-5-21-3751615291 
14151 | S-1-5-21-3751615294-50722 

はEMPIDについて.I利用可能な複数のSIDが存在し、複数の列にこれらのSID(ソート)SQLのSELECTクエリマッピングすることができます(と店を)書いて助けが必要。

理想のSQLを選択出力は以下の通りです: -

+--------+---------------------------+---------------------+--------------------+--------------------+ 
| Empid | SID1     |  SID2   |  SID3  |  SID4  | 
+--------+---------------------------+---------------------+--------------------+--------------------+ 
| 12312 | S-1-5-21-3751-65291  | S-1-5-21-375165292 | S-1-5-21-375165294 | S-1-5-21-375165298 | 
| 12313 | S-1-5-21-3751615294-5078 | NULL    | NULL    | NULL    | 
| 13546 | S-1-5-21-3751615294-50725 | NULL    | NULL    | NULL    | 
+--------+---------------------------+---------------------+--------------------+--------------------+ 

私はCSVファイルから(クエリを選択し、SQLを使用して)自分のアプリケーションのコレクタに従業員レコードを収集し、彼の記録.MaximumでこれらのSIDを収集する必要がありますしています4つのSIDが可能なので、SIDの4つの属性を作成しました。

ありがとうございます。

+2

なぜそういうものを保存したいのですか。なぜSIDをIDにマッピングするテーブルを持たないので、1行に1つのペアがありますか? –

答えて

1

おそらく、あなたは列の数を知っています。もしそうなら、あなたは条件付きの集約とrow_number()使用してそれを行うことができます。

select empid, 
     max(case when seqnum = 1 then sid end) as sid_1, 
     max(case when seqnum = 2 then sid end) as sid_2, 
     max(case when seqnum = 3 then sid end) as sid_3, 
     max(case when seqnum = 4 then sid end) as sid_4 
from (select t.*, row_number() over (partition by empid order by empid) as seqnum 
     from t 
    ) t 
group by empid; 

をあなたは番号がわからない場合は、おそらくカンマ区切りのリストが行います。

select empid, listagg(sid, ',') within group (order by sid) as sids 
from t 
group by empid; 

をSQLクエリがあり固定数の列であるため、柔軟な列数を持つ結果セットには動的SQLが必要です。

1

ウィンドウ関数row_number()を使用して、各empid内のsidに行番号を割り当て、条件付き集計を使用して最終結果を得ることができます。

select 
    empid, 
    min(case when rn = 1 then sid end) sid1, 
    min(case when rn = 2 then sid end) sid2, 
    min(case when rn = 3 then sid end) sid3, 
    min(case when rn = 4 then sid end) sid4 
from (select 
    t.*, 
    row_number() over (partition by empid order by sid) rn 
from table t) group by empid; 
関連する問題