2016-12-23 51 views
0

我工作的甲骨文11g和我想写一个查询,将插入11克LISTAGG功能“?”在两个日期之间的所有缺失月份。这是我能够实现的。 但是,现在我想整理单个记录中特定列的所有记录。我已经使用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;

我面对错误在第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列,因此我无法实现预期的结果。

任何帮助将不胜感激。

谢谢

+0

在你有外部查询'GROUP BY facilitynumber',那就是t他的理由是你得到这个错误。取消组合并获取上个月的行,它可能工作。 –

+0

编号相同的错误。 – Anuja

回答

2

对于什么是非常糟糕的做法,至少在Oracle中,您正在付出代价。

当您在双引号声明列名,如"facilitystatus",它被记录在严格按照书面目录 - 小写。当你在没有双引号的外部查询中引用它时,名称会自动转换为大写(这是Oracle所做的,我不知道其他数据库产品)。所以当然这是不匹配的。

其实完全没有必要在子查询中的双引号。删除它们,看看会发生什么。 (或者查询会起作用,否则你会得到一个不相关的错误。)祝你好运!

千万不要使用双引号的名称。它们用于以下几个原因,其中没有任何意义(更好地避免这种情况在第一时间):

  • 使用特定的资本(而不是不区分大小写 - 默认名称在目录中进入全部大写,并在你的代码,你可以使用任何大小写)
  • 嵌入空格名字
  • 将保留字和关键字(如DATECOLUMN)作为列或表名
+0

棒极了! 我不知道报价问题。删除那些引用对我有用:) – Anuja