具有分组的多列的Oracle字符串串联

时间:2013-07-29 20:33:23

标签: string oracle concatenation grouping

我的表格数据如下:

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()功能我可以获得所需格式的数据,但SystemNameTermID值不在同一个订单中。

例如,我的结果如下:

SupID     SystemName    TermID
================================
Sup1      Sys2:Sys1     23,12:10,11,15

先谢谢你的帮助。

1 个答案:

答案 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是必需的,因此,如果您确实希望避免按照SupIDNULL之类的无害方式排序:

LISTAGG(TermID, ',') WITHIN GROUP (ORDER BY SupID) AS TermIDList

LISTAGG(TermID, ',') WITHIN GROUP (ORDER BY NULL) AS TermIDList

这可能有效,也可能无效。 Oracle将确定排序顺序,如果你真的非常幸运,它会以你想要的方式出现:)

或者,如果您有另一列确定订单(例如PK或时间戳),请使用该列。