2008-10-24 65 views
8

時逗號分隔的多個值我有一個看起來像SQL - 使用GROUP BY

CUSTOMER, CUSTOMER_ID, PRODUCT 
ABC INC 1   XYX 
ABC INC 1   ZZZ 
DEF CO  2   XYX 
DEF CO  2   ZZZ 
DEF CO  2   WWW 
GHI LLC 3   ZYX 

我想編寫一個查詢,會做的數據是這樣的數據:

CUSTOMER, CUSTOMER_ID, PRODUCTS 
ABC INC 1   XYX, ZZZ 
DEF CO 2   XYX, ZZZ, WWW 
GHI LLC 3   ZYX 

使用Oracle 10g,如果有幫助。我看到了一些使用MYSQL的工作,但我需要一個普通的SQL或ORACLE等價物。我也看到了可以製作的存儲過程的例子,但是,我不能在我使用的產品中使用存儲過程。

這裏的,結果怎樣在MySQL的工作,如果我用它

SELECT CUSTOMER, 
     CUSTOMER_ID, 
     GROUP_CONCAT(PRODUCT) 
FROM MAGIC_TABLE 
GROUP BY CUSTOMER, CUSTOMER_ID 

謝謝。

+0

如何在SQL Server – 2012-09-28 11:32:38

回答

4

This link指的是在Oracle上執行此操作的多種不同方式的示例。看看你有沒有什麼權限在你的數據庫上做。

+0

-1中做同樣的事情,因爲這個答案本身沒用。請考慮通過總結鏈接中的內容來改進您的答案,以免將來鏈接失效。 – axiopisty 2017-06-19 21:07:19

0

感謝薛明,

我的SQL不是優雅的可能,但我需要,需要SQL只,而不是PLSQL或TSQL的解決方案,所以它結束了看起來像這樣:

SELECT CUSTOMER, CUSTOMER_ID, COUNT(PRODUCT) PROD_COUNT, 
     RTRIM( 
      XMLAGG(XMLELEMENT (C, PRODUCT || ',') ORDER BY PRODUCT 
).EXTRACT ('//text()'), ',' 
     ) AS PRODUCTS FROM  (
     SELECT DISTINCT CUSTOMER, CUSTOMER_ID, PRODUCT 
     FROM  MAGIC_TABLE 
     ) GROUP BY CUSTOMER, CUSTOMER_ID ORDER BY 1 , 2 

仍然不完全確定XML功能究竟做了什麼,但是當需求出現問題時我會深入研究。

10

我覺得LISTAGG是功能最好的彙總羣在這種情況下使用:

SELECT CUSTOMER, CUSTOMER_ID, 
     LISTAGG(PRODUCT, ', ') WITHIN GROUP (ORDER BY PRODUCT) 
    FROM SOME_TABLE 
GROUP BY CUSTOMER, CUSTOMER_ID 
ORDER BY 1, 2 
+2

LISTAGG在10g中不可用。 – 2012-04-21 01:14:50

3

Oracle用戶功能「wm_concat」被以同樣的方式作爲LISTAGG除了你不能指定一個分隔符「」默認或排序順序。但它與10g兼容。