我的表格数据如下:
SupID SystemName TermID
================================
Sup1 Sys1 23
Sup1 Sys1 12
Sup1 Sys2 10
Sup1 Sys2 11
Sup1 Sys2 15
Sup2 Sys2 22
Sup2 Sys3 12
Sup2 sys3 16
Sup3 Sys4 45
我需要显示如下数据:
SupID SystemName TermID
================================
Sup1 Sys1:Sys2 23,12:10,11,15
Sup2 Sys2:Sys3 22:12,16
Sup3 Sys4 45
使用t_string_agg()
功能我可以获得所需格式的数据,但SystemName
和TermID
值不在同一个订单中。
例如,我的结果如下:
SupID SystemName TermID
================================
Sup1 Sys2:Sys1 23,12:10,11,15
先谢谢你的帮助。
答案 0 :(得分:1)
如果您使用的是Oracle 11,LISTAGG
function将为您执行此操作:
SELECT
SupID,
LISTAGG(SystemName, ':') WITHIN GROUP (ORDER BY SystemName) AS SystemNameList,
LISTAGG(TermID, ',') WITHIN GROUP (ORDER BY TermID) AS TermIDList
FROM MyTable
GROUP BY SupID
ORDER BY SupID
此查询将按SystemName
排序SystemName
列表,并按TermID
排序TermName
列表。
您请求的输出没有排序列表。 ORDER BY
中的LISTAGG
是必需的,因此,如果您确实希望避免按照SupID
或NULL
之类的无害方式排序:
LISTAGG(TermID, ',') WITHIN GROUP (ORDER BY SupID) AS TermIDList
或
LISTAGG(TermID, ',') WITHIN GROUP (ORDER BY NULL) AS TermIDList
这可能有效,也可能无效。 Oracle将确定排序顺序,如果你真的非常幸运,它会以你想要的方式出现:)
或者,如果您有另一列确定订单(例如PK或时间戳),请使用该列。