Есть ли решение для суммирования нескольких значений из одного столбца в один другой столбец с условием?

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