[英]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.