我正在研究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列,因此我无法达到预期的结果。
非常感谢任何帮助。
由于
答案 0 :(得分:2)
至少在Oracle中,你正在为一个非常糟糕的做法付出代价。
当您使用双引号声明列名称时,例如"facilitystatus"
,它将完全按照书面形式记录在目录中 - 使用小写。当你在没有双引号的外部查询中引用它时,名称会自动转换为大写(这就是Oracle所做的,我不了解其他数据库产品)。所以当然存在不匹配。
子查询中绝对不需要双引号。删除它们,看看会发生什么。 (查询将起作用,否则您将得到一个不同的,无关的错误。)祝您好运!
不要使用双引号。使用它们的原因如下,其中没有一个是有意义的(最好先避免这种情况):
DATE
和COLUMN
)作为列名或表名