-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並べ替えます。TermIDTermName

要求された出力には、並べ替えられたリストがありません。ORDER BYinLISTAGGが必要なので、並べ替えを本当に避けたい場合は、 or のような無害なもので並べ替えてSupIDくださいNULL:

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

また

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

それはうまくいかないかもしれません。オラクルがソート順を決定します。本当に運が良ければ、思い通りになるでしょう:)

または、順序を決定する別の列 (PK やタイムスタンプなど) がある場合は、それを使用します。

于 2013-07-29T21:04:56.890 に答える