-1

我的表数据如下所示:

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

在此先感谢您的帮助。

4

1 回答 1

1

如果您使用的是 Oracle 11,该LISTAGG函数将为您执行以下操作:

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 BYin是必需的LISTAGG,因此,如果您确实想避免按无害的顺序排序,例如SupIDor NULL

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

或者

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

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

或者,如果您有另一列确定顺序(例如 PK 或时间戳),请使用它。

于 2013-07-29T21:04:56.890 回答