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

时间:2016-12-23 11:55:10

标签: oracle11g aggregate-functions listagg

我正在研究Oracle 11g,我正在尝试编写一个插入'?'的查询对于2个日期之间所有缺失的月份。这个我能够实现。 但是,现在我想整理单个记录中特定列的所有记录。我已经使用LISTAGG函数来实现这一点,但是我收到LISTAGG函数内的列的“无效标识符”错误。 这是我的代码: -

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;

我在第二行本身面临错误。我的子查询,即从“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列,因此我无法达到预期的结果。

非常感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:2)

至少在Oracle中,你正在为一个非常糟糕的做法付出代价。

当您使用双引号声明列名称时,例如"facilitystatus",它将完全按照书面形式记录在目录中 - 使用小写。当你在没有双引号的外部查询中引用它时,名称会自动转换为大写(这就是Oracle所做的,我不了解其他数据库产品)。所以当然存在不​​匹配。

子查询中绝对不需要双引号。删除它们,看看会发生什么。 (查询将起作用,否则您将得到一个不同的,无关的错误。)祝您好运!

不要使用双引号。使用它们的原因如下,其中没有一个是有意义的(最好先避免这种情况):

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