繁体   English   中英

查询以将多个行值分成多个列

[英]Query to get multiple row values into multiple columns

我有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,有多个SID可用。我需要编写sql SELECT查询的帮助,该查询可以将(分类)这些SID映射(并存储)成多列。

所需的SQL Select输出如下:-

+--------+---------------------------+---------------------+--------------------+--------------------+
| 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 select查询),并且需要在他的记录中收集这些SID。最大可能有4个SID,所以我为SID创建了4个属性。

提前致谢 。

大概您知道列数。 如果是这样,您可以使用条件聚合和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。

您可以使用窗口函数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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM