2016-12-30 27 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有多個小島嶼發展中國家提供。我需要幫助編寫可以映射(和存儲)一個SQL SELECT查詢這些SID(排序)爲多列。

期望中的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    | 
+--------+---------------------------+---------------------+--------------------+--------------------+ 

我收集在我的應用程序收集僱員的記錄(使用SQL SELECT查詢)從一個CSV文件,並在需要他的紀錄。最大收集這些SID 4個SID是可能的,所以我爲SID創建了4個屬性。

在此先感謝。

+2

你爲什麼要這樣存放它們;爲什麼不能有一個將SID映射到ID的表,所以每行有一對? –

回答

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;