具有多个子查询的 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 其中有意义(最好首先避免这种情况):
- 使用特定的大写字母(而不是不区分大小写 - 默认情况下,名称在目录中全部大写,并且在您的代码中可以使用任何大写字母)
- 在名称中嵌入空格
- 使用保留字和关键字(如
DATE
和 COLUMN
)作为列或 table 名称
我正在使用 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 其中有意义(最好首先避免这种情况):
- 使用特定的大写字母(而不是不区分大小写 - 默认情况下,名称在目录中全部大写,并且在您的代码中可以使用任何大写字母)
- 在名称中嵌入空格
- 使用保留字和关键字(如
DATE
和COLUMN
)作为列或 table 名称