ORACLE/SQL:wm_concat&order by

Chr*_*n M 3 sql oracle oracle11g wm-concat

我正在使用oracle 11(不确定确切的版本,但由于LISTAGG无效,我认为它不是第2版)通过ODBC和水晶报告2008.

这是我的问题:

这是一张桌子:

TABLE ODB.TASK_CARD_CONTROL  
------------------------------------------  
task_card     control_category     code  
------------------------------------------  
1                  zone             17  
1                  zone             33  
1                  zone             21  
2                  zone             18  
2                  zone             05  
3                  zone             55  
3                  zone             32  
3                  zone             72 
Run Code Online (Sandbox Code Playgroud)

我正在使用WM_CONCAT函数来获得这样的东西:

task_card      zones
1              17,33,21
2              18,05
3              55,32,72
Run Code Online (Sandbox Code Playgroud)

这是SQL的:

SELECT TASK_CARD, WM_CONCAT(code) as ZONES
FROM ODB.TASK_CARD_CONTROL
WHERE ODB.TASK_CARD_CONTROL.CONTROL_CATEGORY = 'ZONE'
GROUP BY TASK_CARD
Run Code Online (Sandbox Code Playgroud)

但是我想要对区域进行排序,所以我尝试了这个:

SELECT TASK_CARD, WM_CONCAT(code) as ZONES
FROM (SELECT TASK_CARD, CODE, CONTROL_CATEGORY FROM ODB.TASK_CARD_CONTROL 
ORDER BY CODE)
WHERE ODB.TASK_CARD_CONTROL.CONTROL_CATEGORY = 'ZONE'
GROUP BY TASK_CARD
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,它返回以下错误:

Failed to retrieve data from the database.
Details: 42S22:[Oracle][ODBC][Ora]ORA-00904: 
"ODB"."TASK_CARD_CONTROL"."CONTROL_CATEGORY" : invalid identifier
Run Code Online (Sandbox Code Playgroud)

我真的不明白我在这里做错了什么......有人能给我一个暗示吗?

小智 5

对于仍在使用wm_CONCAT(又名较旧的db版本)的任何人:解决方案是添加不同的条件,然后它还将升序应用于连接的值.

不要问为什么没有记录,但它会起作用.

此外,在子查询中使用order by,wm_concat之前只会随机化顺序,因此不应该推荐它.

请求的SQL示例:

SELECT TASK_CARD, WM_CONCAT(distinct code) as ZONES
FROM ODB.TASK_CARD_CONTROL
WHERE ODB.TASK_CARD_CONTROL.CONTROL_CATEGORY = 'ZONE'
GROUP BY TASK_CARD;
Run Code Online (Sandbox Code Playgroud)

请注意,在程序/包中使用时,distinct选项不起作用.


Ton*_*ews 2

您无法从内部查询外部引用 ODB.TASK_CARD_CONTROL.CONTROL_CATEGORY。尝试:

SELECT TASK_CARD, WM_CONCAT(code) as ZONES
FROM (SELECT TASK_CARD, CODE, CONTROL_CATEGORY FROM ODB.TASK_CARD_CONTROL 
      WHERE ODB.TASK_CARD_CONTROL.CONTROL_CATEGORY = 'ZONE'
      ORDER BY CODE)
GROUP BY TASK_CARD
Run Code Online (Sandbox Code Playgroud)