#sql #oracle #aggregate-functions
#sql #Oracle #агрегатные функции
Вопрос:
Я застрял с функцией ‘SUM’ в Oracle SQL
Здесь часть запроса, которую я использую для вычисления общего времени в секунду для всей строки ‘APLFTSK_CODE’ с именем ACC. Имя столбца для результатов — TIME_TOTAL_ACC
SUM (
CASE
WHEN
APLFTSK.APLFTSK_CODE = 'AAC'
AND APLCALL.APLCALL_NUM = APLTSK.APLTSK_APLCALL
THEN
ROUND((APLTSK.APLTSK_FEND - APLTSK.APLTSK_FBEGIN)* (24 * 60)*60)
END
)
Вот результат, который я получаю, когда пытаюсь «СУММИРОВАТЬ»
https://i.stack.imgur.com/OtFn3.jpg )
Я получил только один результат строки, а не сумму всех строк, удовлетворяющих условию. Я хочу тот же результат ‘2403’ для всех строк, удовлетворяющих условию.
Я попробовал «сгруппировать по» во вложенном выборе внутри обращения, но в результате получил «однострочный подзапрос возвращает более одной строки»
SUM (
CASE
WHEN
APLFTSK.APLFTSK_CODE = 'AAC'
AND APLCALL.APLCALL_NUM = APLTSK.APLTSK_APLCALL
THEN
(
SELECT
ROUND((APLTSK.APLTSK_FEND - APLTSK.APLTSK_FBEGIN)* (24 * 60)*60)
FROM APLTSK, APLFTSK
GROUP BY APLTSK.APLTSK_NUM,APLFTSK.APLFTSK_CODE
)
END
)
Я не знаю, как обращаться с этой функцией в этом случае. Я прочитал несколько примеров о том, как использовать функцию ‘SUM’ в Oracle, но я не знаю, как применить это к моему случаю. Большую часть времени «СУММА» предназначена для получения результата по разным столбцам в одной строке.
Заранее спасибо за вашу помощь
Комментарии:
1. Пожалуйста, покажите ваш текущий результат в виде текста, а не изображения, а также покажите выходные данные, которые вы пытаетесь получить, вместе с соответствующими образцами данных и вашим полным запросом.
2.
sum
Функция является агрегатной функцией — она возвращает одно значение для всех сгруппированных строк. Вам нужна одна строка или аналитическая функция; как только вы предоставите информацию, запрошенную Алексом, мы, вероятно, сможем указать вам соответствующий тип функции. Однорядные функции: docs.oracle.com/cd/E11882_01/server.112/e41084/… Агрегатные функции: docs.oracle.com/cd/E11882_01/server.112/e41084/… Аналитические функции (они довольно сложные …): docs.oracle.com/cd/E11882_01/server.112/e41084 /…
Ответ №1:
Вы, вероятно, ищете аналитическую версию sum()
, что-то вроде:
CASE WHEN APLFTSK.APLFTSK_CODE = 'AAC' AND APLCALL.APLCALL_NUM = APLTSK.APLTSK_APLCALL
THEN SUM(ROUND((APLTSK.APLTSK_FEND - APLTSK.APLTSK_FBEGIN) * 24*60*60))
OVER (PARTITION BY APLFTSK.APLFTSK_CODE)
ELSE 0
END
хотя неясно, как любая группировка, которую вы могли бы иметь на месте, может повлиять на результат.
Комментарии:
1. Большое спасибо, Алекс! Это именно то, что я искал. Я впервые использую аналитическую версию SUM. Это мощно. Я использую много группировок в своем запросе, чтобы избежать множественных результатов для одной и той же строки, поэтому аналитическая функция работает как по маслу.