Mysql подзапрос с суммой вызывает проблемы - PullRequest
3 голосов
/ 26 августа 2011

Это сводная версия проблем, с которыми я сталкиваюсь, но суть моей проблемы.Настоящая проблема связана с огромными группами ежемесячных таблиц данных UNION, но SQL будет огромным и ничего не добавит.Итак:

SELECT entity_id, 
    sum(day_call_time) as day_call_time
            from (
                SELECT entity_id, 
                    sum(answered_day_call_time) as day_call_time
                    FROM XCDRDNCSum201108 
                    where (day_of_the_month >= 10 AND  day_of_the_month<=24) 
                    and LPAD(core_range,4,"0")="0987" 
                    and LPAD(subrange,3,"0")="654" 
                    and SUBSTR(LPAD(core_number,7,"0"),4,7)="3210"
            ) as summary

- это проблема: когда таблица в подзапросе XCDRDNCSum201108 не возвращает строк, поскольку она является суммой, значения столбцов содержат нуль.И entity_id является частью первичного ключа и не может быть нулевым.Если я вычитаю сумму и просто запрашиваю entity_id, подзапрос не содержит строк, и, следовательно, внешний запрос не завершается ошибкой, но когда я использую sum, я получаю ошибку 1048 Столбец entity_id не может быть нулевымкак мне обойти эту проблему?Иногда нет данных.

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

Вы полностью перерабатываете запрос ... предварительно суммируя внутри, затем снова суммируя снаружи. Кроме того, я понимаю, что вы не администратор базы данных, но если вы когда-либо выполняете агрегацию, вам, как правило, нужны критерии, по которым она сгруппирована. В представленном здесь случае вы получаете сумму вызовов для всех идентификаторов сущностей. Таким образом, вы должны иметь группу по любым неагрегатам. Однако, если все, что вас волнует, это общий итог БЕЗ отношения к entity_ID, тогда вы можете пропустить группу, но также НЕ включать фактический идентификатор объекта ...

Если вы хотите, чтобы показывать фактическое время для конкретного идентификатора объекта ...

SELECT
      entity_id, 
      sum(answered_day_call_time) as day_call_time,
      count(*) number_of_calls
   FROM
      XCDRDNCSum201108 
   where
          (day_of_the_month >= 10 AND  day_of_the_month<=24) 
      and LPAD(core_range,4,"0")="0987" 
      and LPAD(subrange,3,"0")="654" 
      and SUBSTR(LPAD(core_number,7,"0"),4,7)="3210"
   group by
      entity_id

Это приведет к чему-то вроде (фиктивные данные)

Entity_ID   Day_Call_Time   Number_Of_Calls
1           10              3
2           45              4
3           27              2

Если все, что вас заботило, это общее время звонка

SELECT
      sum(answered_day_call_time) as day_call_time,
      count(*) number_of_calls
   FROM
      XCDRDNCSum201108 
   where
          (day_of_the_month >= 10 AND  day_of_the_month<=24) 
      and LPAD(core_range,4,"0")="0987" 
      and LPAD(subrange,3,"0")="654" 
      and SUBSTR(LPAD(core_number,7,"0"),4,7)="3210"

Это приведет к чему-то вроде (фиктивные данные)

Day_Call_Time   Number_Of_Calls
82              9
0 голосов
/ 26 августа 2011

Будет:

sum(answered_day_call_time) as day_call_time

изменено на

ifnull(sum(answered_day_call_time),0) as day_call_time

работа? Я предполагаю, что mysql здесь, но функция coalesce будет / должна работать тоже.

...