2015-07-07 2 views
1

Я следующее утверждение, которое отлично работает для подсчета количества подписанных заметок пользователя (GRIDTEXT) в базе данных заданных в пределах заданного диапазона дат:Oracle Сумма подзапроса в Select

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> 

Мне нужно знать, сколько нот каждый пользователь выполнил «ПОДПИСАЛИ «действие (работа) и количество заметок, которые они были последним пользователем для входа в систему (последний UPDATE_DT при группировке с помощью EXAMID, не работает)

Что мне здесь не хватает ...

+1

Вы не можете встроить выбрать так, и ROWNUM логика не является правильным. Нужен встроенный просмотр или аналогичный. Можете ли вы показать примерную таблицу и ожидаемый результат? – OldProgrammer

+0

избегать сюрпризов и использовать TO_DATE ('01 -JUL-2015 ',' DD-MON-YYYY ') – kevinsky

+0

Что вам не хватает? Закрывающая скобка для вашей функции sum. Но, как упоминалось выше, это не ваша самая серьезная проблема, –

ответ

1

Вы можете использовать аналитику row_number() function, как намекнул TheMadDBA; Oracle says that is superior to rownum, и вы все равно не использовали это должным образом.

Это присваивает номер строки каждой записи идентификатора экзамена, причем последняя имеет номер 1. На основании вашего ограниченного образца и того, как вы пытались выполнить подзапрос, это должно выходить за пределы диапазона, который вы запрашиваете, поэтому я включил нижний конец диапазона дат в строчном представлении (как и все, что до этого еще не актуально), и верхний конец диапазона во внешнем запросе. Поэтому последняя дата может быть после 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 - это число, которое не совсем ясно, то оно не должно быть заключено в кавычки.

SQL Fiddle demo

+0

Спасибо, Алекс, я думаю, что это делает трюк. Я переместил «MISC1 =« SIGNED »во внутренний запрос, так как соответствующие строки также должны иметь это значение.Я все еще работаю, чтобы проверить, что данные на 100% правильны, но должны быть в состоянии настроить его здесь. Ура! – Thildemar

Смежные вопросы