[英]Oracle Sum of Subquery in Select
我有以下语句可以很好地计算在给定日期范围内给定的数据库中用户(GRIDTEXT)签名的笔记数:
SELECT
GRIDTEXT "User",
COUNT(GRIDTEXT) "SignedNotes"
FROM CAPTURED_ELEMENT CE
WHERE APPLICATION_ID = '8'
AND UPDATE_DT BETWEEN '01-JUL-2015' AND '05-JUL-2015'
AND MISC1 = 'SIGNED'
GROUP BY GRIDTEXT
这样工作并返回如下:
User SignedNotes
Jim 5
Laura 3
我需要添加一列来统计这些便笺是最后一个签署者的数量。 我已经尝试了下面的代码和一些变体,但始终收到“缺少表达式”错误。
SELECT
GRIDTEXT "User",
COUNT(GRIDTEXT) "SignedNotes",
SUM(SELECT COUNT(CX.GRIDTEXT)
FROM CAPTURED_ELEMENT CX
WHERE CX.EXAMID = CE.EXAMID
AND APPLICATION_ID = '8'
AND ROWNUM = 1
AND CX.GRIDTEXT = CE.GRIDTEXT
ORDER BY UPDATE_DT DESC) "FinalNotes"
FROM CAPTURED_ELEMENT CE
WHERE APPLICATION_ID = '8'
AND UPDATE_DT BETWEEN '01-JUL-2015' AND '05-JUL-2015'
AND MISC1 = 'SIGNED'
GROUP BY GRIDTEXT
此错误,但应返回:
User SignedNotes FinalNotes
Jim 5 2
Laura 3 1
该表的结构很杂乱,但基本上是:
GRIDTEXT APPLICATION_ID UPDATE_DT MISC1 EXAMID
<Name of User> <Note Type (#)> <Date of Action> <ActionType> <Encounter>
我需要知道每个用户对(工作)执行“签名”操作的注释数,以及他们是最后一个登录用户的注释数(按EXAMID分组时为最后一个UPDATE_DT,不起作用)
我在这里想念什么...
您可以按TheMadDBA提示使用分析row_number()
函数 ; Oracle 表示这优于rownum
,而且您无论如何都没有正确使用它。
这会为每条考试ID记录分配一个行号,最新的行号为1。根据您的有限样本以及您尝试子查询的方式,该行号应超出您要查询的范围,因此我在其中包括了内联视图中的日期范围(之前的任何内容均不相关),外部查询中范围的上限。 因此,最近的日期可以是7月5日之后。 外部查询使用行号仅对最近的记录进行计数,因为该记录的行号为1。
SELECT
GRIDTEXT "User",
COUNT(GRIDTEXT) "SignedNotes",
COUNT(CASE WHEN RN = 1 THEN GRIDTEXT END) "FinalNotes"
FROM (
SELECT CE.*,
ROW_NUMBER() OVER (PARTITION BY EXAMID ORDER BY UPDATE_DT DESC) RN
FROM CAPTURED_ELEMENT CE
WHERE APPLICATION_ID = '8'
AND UPDATE_DT >= DATE '2015-07-01'
)
WHERE UPDATE_DT <= DATE '2015-07-05'
AND MISC1 = 'SIGNED'
GROUP BY GRIDTEXT
ORDER BY GRIDTEXT;
User SignedNotes FinalNotes
----- ----------- ----------
Jim 5 2
Laura 3 1
您说过您在实际代码中提供的日期有所不同,但是无论如何我在这里都使用了日期文字。 另外,如果application_id
是一个数字(尚不完全清楚),则不应将其用引号引起来。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.