具有多个子查询的 Oracle 11g LISTAGG 函数

Oracle 11g LISTAGG function with multiple subquery

我正在使用 Oracle 11g,我正在尝试编写一个将插入“?”的查询对于 2 个日期之间的所有缺失月份。这是我能够实现的。 但是,现在我想将特定列的所有记录整理到一条记录中。我使用 LISTAGG 函数来实现此目的,但是我在 LISTAGG 函数内的列中收到错误 "invalid identifier"。 这是我的代码:-

Select facilitynumber, LISTAGG(facilitystatus, '') WITHIN GROUP (ORDER BY null) "Profile" FROM ( WITH allmonths AS ( SELECT to_date(level, 'MM') AS allmnths FROM dual CONNECT BY LEVEL BETWEEN '01' AND '05' ), months AS ( SELECT * FROM ( SELECT ccds.facilitynumber,ccds.facilitystatus, dsub.filecreationdate as FacilityStatusDate, dsub.submissiondate, ROW_NUMBER() OVER (partition by ccds.facilitynumber,extract(month from dsub.submissiondate) order by dsub.submissiondate DESC) r FROM ccdssubmissions ccds INNER JOIN datasubmission dsub ON ccds.datasubmissionid = dsub.datasubmissionid INNER JOIN datasupplier dsup ON dsub.datasupplierid = dsup.datasupplierid WHERE ccds.matchedcompanynumber = 'TEST9239' ORDER BY dsub.submissiondate DESC ) where r = 1) SELECT allmnths, CASE WHEN facilitystatus IS NULL THEN '?' ELSE facilitystatus END AS "facilitystatus", submissiondate, facilitynumber FROM allmonths LEFT OUTER JOIN months ON extract(month from allmonths.allmnths) = extract(month from months.submissiondate) order by allmnths ) GROUP BY facilitynumber;

我在第 2 行本身遇到了错误。我的子查询,即从 "WITH" 开始的查询返回结果如下:-

ALLMNTHS| facilitystatus | submissiondate | facilitynumber 

---------    | ---------------    | ---------------    | ---------------    
01-JAN-16    | U                  | 23-JAN-16          | FAC01              
01-FEB-16    | ?                  | null               | null               
01-MAR-16    | 1                  |05-MAR-16           | FAC01             

现在使用 LISTAGG(facilitystatus, ''),我希望我的结果是 ->

Profile|  facilitynumber
  U?1          |   FAC01   

但是,Oracle 无法识别 facilitystatus 列,因此我无法获得预期的结果。

如有任何帮助,我们将不胜感激。

谢谢

您正在为非常糟糕的做法付出代价,至少在 Oracle 中是这样。

当您在双引号中声明一个列名时,例如 "facilitystatus",它在目录中的记录与写入的完全一样 - 小写。当你在没有双引号的外部查询中引用它时,名称会自动转换为大写(Oracle 就是这样做的,我不知道其他 DB 产品)。所以当然有不匹配。

子查询中完全不需要双引号。删除它们,看看会发生什么。 (要么查询有效,要么你会得到一个不同的、不相关的错误。)祝你好运!

永远不要使用双引号引起来的名字。使用它们的原因如下,none 其中有意义(最好首先避免这种情况):

  • 使用特定的大写字母(而不是不区分大小写 - 默认情况下,名称在目录中全部大写,并且在您的代码中可以使用任何大写字母)
  • 在名称中嵌入空格
  • 使用保留字和关键字(如 DATECOLUMN)作为列或 table 名称