2016-12-30 26 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;