Select 中子查询的 Oracle Sum
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
这有效,return就像这样:
User SignedNotes
Jim 5
Laura 3
我需要添加一个列来计算他们是最后一个用户签名的笔记的数量。我尝试了下面的代码和一些变体,但不断收到 "missing expression" 错误。
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
这个错误,但是应该return:
User SignedNotes FinalNotes
Jim 5 2
Laura 3 1
table结构比较乱,但基本上:
GRIDTEXT APPLICATION_ID UPDATE_DT MISC1 EXAMID
<Name of User> <Note Type (#)> <Date of Action> <ActionType> <Encounter>
我需要知道每个用户对(工作)执行了 "SIGNED" 操作的笔记有多少,以及他们是最后登录的用户有多少笔记(按 EXAMID 分组时最后 UPDATE_DT , 不工作)
我在这里错过了什么...
您可以使用解析 row_number()
function as TheMadDBA hinted; Oracle says that is superior to 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
是一个不完全清楚的数字,则不应将其用引号引起来。
我有以下语句可以很好地计算给定日期范围内给定数据库中用户 (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
这有效,return就像这样:
User SignedNotes
Jim 5
Laura 3
我需要添加一个列来计算他们是最后一个用户签名的笔记的数量。我尝试了下面的代码和一些变体,但不断收到 "missing expression" 错误。
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
这个错误,但是应该return:
User SignedNotes FinalNotes
Jim 5 2
Laura 3 1
table结构比较乱,但基本上:
GRIDTEXT APPLICATION_ID UPDATE_DT MISC1 EXAMID
<Name of User> <Note Type (#)> <Date of Action> <ActionType> <Encounter>
我需要知道每个用户对(工作)执行了 "SIGNED" 操作的笔记有多少,以及他们是最后登录的用户有多少笔记(按 EXAMID 分组时最后 UPDATE_DT , 不工作)
我在这里错过了什么...
您可以使用解析 row_number()
function as TheMadDBA hinted; Oracle says that is superior to 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
是一个不完全清楚的数字,则不应将其用引号引起来。