Оптимизировать запрос SQL для отображения 0 для пустых данных - PullRequest
0 голосов
/ 01 мая 2018

Итак, у меня есть таблица с этими данными:

Sample data

У меня есть этот запрос:

select count(id) "Count",
       case id
           when 0 then 'Zeroes'
           when 1 then 'Ones'
       end "Name",
       sum(num1) "Num 1",
       sum(num2) "Num 2",
       sum(num3) "Num 3"
from mytable
where added_date >= :FROM_DT
and added_date <= :TO_DT
group by id;

Когда: FROM_DT - 01 января 2018 года, а TO_DT - 02 января 2018 года, я получаю следующий результат: Sample output

Однако, когда я изменяю: TO_DT на 01-JAN-2018, я получаю следующий результат: Sample output

Я хочу показать второй ряд с нулями для нулей.

У меня есть запрос, который я не уверен, оптимизирован или нет:

select "Count",
       "Name",
       NVL("Num 1", 0) "Num 1",
       NVL("Num 2", 0) "Num 2",
       NVL("Num 3", 0) "Num 3"
from (
    select count(id) "Count",
        'Ones' "Name",
        sum(num1) "Num 1",
        sum(num2) "Num 2",
        sum(num3) "Num 3"
    from mytable
    where added_date >= :FROM_DT
    and added_date <= :TO_DT
    and id = 1
    union
    select count(id) "Count",
           'Zeroes' "Name",
            sum(num1) "Num 1",
            sum(num2) "Num 2",
            sum(num3) "Num 3"
    from mytable
    where added_date >= :FROM_DT
    and added_date <= :TO_DT
    and id = 0
)

Результаты, которые я получаю по этому запросу, - это то, что я хочу:

Sample Result Wanted

Я использую этот запрос для большого количества данных, поэтому я хочу знать, есть ли способ получить желаемые результаты с помощью более быстрого запроса.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вы можете попробовать:

select sum(case when id >0 then 1 else 0 end ) "Count",
   case id
       when 0 then 'Zeroes'
       when 1 then 'Ones'
   end "Name",
   sum(case when id >0 then num1 else 0 end ) "Num 1",
   sum(case when id >0 then num2 else 0 end ) "Num 2",
   sum(case when id >0 then num3 else 0 end ) "Num 3"
from mytable
where added_date >= '20180101'
and added_date <= '20180102'
group by id;
0 голосов
/ 01 мая 2018

Я думаю, что left join будет более подходящим. Если вы можете перечислить значения:

select count(t.id) as "Count",
       i.Name,
       coalesce(sum(t.num1), 0) as num_1,
       coalesce(sum(t.num2), 0) as num_2,
       coalesce(sum(t.num3), 0) as num_3
from (select 0, 'Zeroes' from dual
      union all 
      select 1, 'Ones' from dual
     ) i left join
     mytable t
     on i.id = t.id and
        t.added_date >= :FROM_DT and
        t.added_date <= :TO_DT
group by i.name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...