2008-10-24 66 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兼容。