13

我有看起来像的数据

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

4 回答 4

21

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

  SELECT CUSTOMER, CUSTOMER_ID,
         LISTAGG(PRODUCT, ', ') WITHIN GROUP (ORDER BY PRODUCT)
    FROM SOME_TABLE
GROUP BY CUSTOMER, CUSTOMER_ID
ORDER BY 1, 2
于 2012-04-20T20:06:01.127 回答
4

此链接引用了许多在 Oracle 上执行此操作的不同方法的示例。看看那里是否有你对你的数据库有权限做的事情。

于 2008-10-24T17:44:45.600 回答
3

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

于 2012-11-12T15:11:47.937 回答
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 函数究竟做了什么,但是当需要时我会深入研究。

于 2008-10-24T18:52:03.157 回答