Как суммировать значение столбцов с одним уникальным результатом с суммой всех столбцов

user63898 спросил: 10 мая 2018 в 04:15 в: sql

У меня есть запрос UNION ALL, который дает мне результаты набора результатов из нескольких строк.
Я хочу суммировать значение Только строки, которые имеют определенное условие true, например:

ELECT P_ID pid,   P_COUNT pcount  from
 ( 
   SELECT  pid, ROUND(SUM(pcount*1)) pcount  , OBJ_ID objId 
   FROM  SEARCH_H  
   WHERE  objId = '1' and  pstart <= ADD_MONTHS(TO_DATE('05/01/2018 12:00 AM', 'MM/DD/YYYY HH12:MI AM'), -3)   
   GROUP BY  objId,  pid           UNION ALL     SELECT  pid,  ROUND(SUM(  pcount*2)) pcount ,  OBJ_ID objId 
   FROM  SEARCH_H   
   WHERE  objId ='1' and pstart > TO_DATE('05/01/2018 12:00 AM', 'MM/DD/YYYY HH12:MI AM')  
   GROUP BY  objId,  pid   ) results
 ORDER BY pcount desc ;  

Теперь таблица:

P_ID(VARCHAR2),
OBJ_ID(VARCHAR2), 
P_COUNT(NUMBER),
pstart(TIMESTAMP)

Данные

1,1,1,05/01/2018 12:00
1,2,1,05/01/2018 12:00
33,2,1,05/01/2018 12:00
1,1,1,05/01/2018 12:001,1,1,06/01/2018 12:00
1,2,1,06/01/2018 12:00
1,2,1,06/01/2018 12:00
33,1,1,06/01/2018 12:00

, поэтому результаты будут следующими:

1,9
33,3

Теперь мои результаты выглядят так: моя проблема заключается в том, что каждый выбирает сумму своих результатов отдельно Итак, теперь мой результат:

1,3    
33,2
1,6
33,2

Я действительно застрял здесь ...

2 ответа

The Impaler ответил: 10 мая 2018 в 06:07

Я думаю, вам нужно сгруппировать (снова) в основном запросе, как в:

SELECT P_ID pid, sum(pcount) from
 ( 
   SELECT  pid, ROUND(SUM(pcount*1)) pcount  , OBJ_ID objId 
   FROM  SEARCH_H  
   WHERE  objId = '13089' and  pstart <= ADD_MONTHS(TO_DATE(
     '05/01/2018 12:00 AM', 'MM/DD/YYYY HH12:MI AM'), -3)   
   GROUP BY  objId,  pid           UNION ALL     SELECT  pid,  ROUND(SUM(  pcount*2)) pcount ,  OBJ_ID objId 
   FROM  SEARCH_H   
   WHERE  objId ='13089' and pstart > TO_DATE(
     '05/01/2018 12:00 AM', 'MM/DD/YYYY HH12:MI AM')  
   GROUP BY  objId,  pid   ) results
 group by pid
 ORDER BY pcount desc ; 
user63898 ответил: 10 мая 2018 в 06:24
Я пробовал это, но получил ошибку: ORA-00979: не выражение GROUP BY 00979. 00000 - "не выражение GROUP BY" Причина: Действие:
starfish_1 ответил: 10 мая 2018 в 04:13

Я не думаю, что вам нужен UNION ALL (или любой тип UNION) для того, что, как я думаю, вы пытаетесь выполнить.

У меня проблема с пониманием вашего вопроса, m correct Возможно, это то, что вы ищете:

select p_id, obj_id, round(sum(p_count)) p_count
from (
    select  p_id, obj_id,
       case
          when pstart <= add_months(to_date('05/01/2018 12:00 AM', 'MM/DD/YYYY HH12:MI AM'), -3)  then p_count*1
          when pstart >  to_date('05/01/2018 12:00 AM', 'MM/DD/YYYY HH12:MI AM')                  then p_count*2
       end p_count
    from search_h       
    )
group by p_id, obj_id
order by p_count desc;
user63898 ответил: 10 мая 2018 в 02:12
Спасибо, но я получаю эту ошибку: ORA-00904: "p_count": недопустимый идентификатор 00904. 00000 - "% s: недопустимый идентификатор" Причина: Действие: Это в строке, где "then p_count 1"
starfish_1 ответил: 10 мая 2018 в 02:18
Имя столбца таблицы pcount или p_count? Я основывался на приведенном выше определении таблицы, но похоже, что ваше имя столбца не является P_COUNT. Если ваше имя столбца является чем-то другим, кроме P_COUNT, замените P_COUNT в аргументе case, где указано p_count 1 и p_count 2 с фактическим именем столбца таблицы.
user63898 ответил: 10 мая 2018 в 02:43
Спасибо, теперь его просто не дают никакого результата. пустой набор результатов
starfish_1 ответил: 10 мая 2018 в 03:10
Вы можете посмотреть данные в своей таблице. Я заметил, что в приведенном выше наборе данных не было значений obj_id 13089, которые есть у вас в вашем запросе. Это означает, что вы ничего не получите. Кроме того, вы хотите взглянуть на даты pstart. У вас есть данные в вашей таблице, где obj_id - 13089, а pstart меньше или равно 02/01/2018 или где obj_id - 13089, а pstart - больше, чем 05/01/2018. Если вы не ищете конкретный объект obj_id, вы можете оставить "где obj_id = '13089"
user63898 ответил: 10 мая 2018 в 04:54
моя ошибка - obj_id = 1

Дополнительное видео по вопросу: Как суммировать значение столбцов с одним уникальным результатом с суммой всех столбцов

Выборочное суммирование столбцов и строк таблицы ИНДЕКС и ПОИСКПОЗ

Уроки MS SQL Server. Ограничение таблицы

Урок9.PL SQL.Функции