Возвращаемое значение счетчика возвращается как 0, если emtpy или нет - PullRequest
0 голосов
/ 28 мая 2019

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

select state, count(phone_number) from VOIP_PHONE_NUMBER_POOL
where status = 3
group by state
order by state asc;

Например, в настоящее время мой запрос возвращает что-то вроде этого

State  Count

AZ     25

Когда я хочу вернуть пустые значения и выглядеть так

State  Count

AZ     25
CA     0

Ответы [ 3 ]

1 голос
/ 28 мая 2019

Это имитирует то, что у вас есть сейчас:

SQL> with voip_phone_number_pool (state, phone_number, status) as
  2    (select 'AZ', 1234, 3 from dual union all
  3     select 'AZ', 2232, 3 from dual union all
  4     select 'AZ', 4444, 3 from dual union all
  5     select 'AZ', 7756, 1 from dual union all
  6     --
  7     select 'CA', 9999, 1 from dual
  8    )
  9  select state,
 10         count(phone_number)
 11  from voip_phone_number_pool
 12  where status = 3
 13  group by state
 14  order by state;

ST COUNT(PHONE_NUMBER)
-- -------------------
AZ                   3

SQL>

Нет строки для состояния CA со значением status = 3, поэтому этот запрос не возвращается.

Что вы могли бы сделать, так это использовать внешнее самостоятельное соединение таким образом:

SQL> with voip_phone_number_pool (state, phone_number, status) as
  2    (select 'AZ', 1234, 3 from dual union all
  3     select 'AZ', 2232, 3 from dual union all
  4     select 'AZ', 4444, 3 from dual union all
  5     select 'AZ', 7756, 1 from dual union all
  6     --
  7     select 'CA', 9999, 1 from dual
  8    ),
  9  states as
 10    (select distinct state from voip_phone_number_pool)
 11  select s.state,
 12         count(v.phone_number)
 13  from states s left join voip_phone_number_pool v on v.state = s.state 
 14                                                  and v.status = 3
 15  group by s.state
 16  order by s.state;

ST COUNT(V.PHONE_NUMBER)
-- ---------------------
AZ                     3
CA                     0

SQL>
  • states CTE выбирает все состояния
  • затем используется во внешнем соединении с voip_phone_number_pool
  • обратите внимание, что условие (status = 3) необходимо перенести в соединение (строка # 14); если вы оставите его в предложении where, вы не получите желаемого результата
0 голосов
/ 31 мая 2019
     SELECT s.state,
            COUNT(v.phone_number) AS phone_number_count
       FROM CORP_ACCT s
       LEFT OUTER JOIN voip_phone_number_pool v
            ON s.state = v.state
   GROUP BY s.state; 

работал для меня

0 голосов
/ 29 мая 2019

Если в таблице фактов (VOIP_PHONE_NUMBER_POOL) нет строк с определенным состоянием, вы не получите такой результат, только запросив эту таблицу.

Вам нужно будет объединить вашу таблицу фактов с таблицей измерений (таблицей со всеми возможными состояниями), чтобы получить желаемые значения.

Например, если у вас есть такая таблица измерений, и она называется «state_info»:

         SELECT s.state,
                COUNT(v.phone_number) AS phone_number_count
           FROM state_info s
LEFT OUTER JOIN voip_phone_number_pool v
                ON s.state = v.state
       GROUP BY s.state;
...