將多個 SQL 行聚合到單一逗號分隔列
本文示範如何將共用公用識別碼的多行合併為一行,並在特定列中使用逗號分隔的清單。 此範例使用包含工單 ID 和關聯個人的表,旨在建立一個結果,其中每個工單 ID 都連結到所有相關個人的清單。
SQL Server 方法(2005 及更高版本)
以下 SQL Server 查詢使用 STUFF()
、ISNULL()
和 FOR XML PATH
實現此目的:
<code class="language-sql">SELECT t.TicketID, STUFF(ISNULL((SELECT ', ' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma], ISNULL((SELECT ', ' + x.Person FROM @Tickets x WHERE x.TicketID = t.TicketID GROUP BY x.Person FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), '') [Preceeding Comma If Not Empty] FROM @Tickets t GROUP BY t.TicketID</code>
此查詢使用子查詢來收集與每個 TicketID
關聯的個體。 FOR XML PATH
方法將結果轉換為連接字串,並且 STUFF()
刪除所有前導逗號。 ISNULL()
函數處理沒有個人與票證關聯的情況。 可選列提供了處理前導逗號的靈活性。
Oracle 解
Oracle 使用 LISTAGG()
函數提供了更簡潔的解決方案:
<code class="language-sql">SELECT TicketID, LISTAGG(Person, ',') WITHIN GROUP (ORDER BY Person) OVER (PARTITION BY TicketID) AS People FROM @Tickets</code>
LISTAGG()
直接將值聚合到以逗號分隔的清單中,並依 Person
欄位排序。 PARTITION BY
子句確保每個不同的 TicketID
發生聚合。 此方法比 SQL Server 等效方法更簡單、更有效率。
以上是如何在 SQL Server 和 Oracle 中將多行連接成逗號分隔的清單?的詳細內容。更多資訊請關注PHP中文網其他相關文章!