SQL - 使用GROUP BY时以逗号分隔的多个值

时间:2008-10-24 17:37:15

标签: sql oracle oracle10g

我的数据看起来像

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

谢谢。

4 个答案:

答案 0 :(得分:15)

我认为LISTAGG是在这种情况下使用的最佳聚合组:

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

答案 1 :(得分:4)

This link是指在Oracle上执行此操作的不同方法的一些示例。看看你的数据库是否有权限。

答案 2 :(得分:3)

oracle用户函数'wm_concat'的工作方式与LISTAGG相同,但默认情况下无法指定分隔符','或排序顺序。但它与10g兼容。

答案 3 :(得分: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函数究竟做了什么,但是当需要出现时我会深入研究。