[英]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.