Вернуть значение счетчика обратно как 0, если emtpy или нет

Я выполняю следующий запрос в нашей базе данных и пытаюсь вернуть значение счетчика как 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

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

Justin Cave 28.05.2019 19:26

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

Branden 28.05.2019 22:31

Как же узнать, какие значения state вы хотите отобразить в конечном результате? Если VOIP_PHONE_NUMBER_POOL имеет все значения состояния, но не status = 3, вы можете выполнить самосоединение, которое предлагает @LittleFoot. Но это будет очень дорого, если предположить, что это достаточно большой стол.

Justin Cave 28.05.2019 22:56

Бесплатных обедов не бывает, @Justin :)

Littlefoot 28.05.2019 22:58

@Littlefoot - Полностью согласен. Однако, если объемы данных не являются действительно странными, я бы настоятельно предпочел создать новую таблицу state, чтобы иметь нужные вам строки. В частности, если в большой таблице фактов есть некоторые проблемы с качеством данных (я видел множество систем, в которых были данные для 70 или 80 из 50 штатов США :-))

Justin Cave 28.05.2019 23:05

Я согласен, @Justin. Модель данных выглядит как неправильно; по крайней мере, таблица voip_phone_number_pool не нормализована. Как вы сказали, state должна быть отдельной таблицей, на которую ссылается voip_.... Что ж, мой запрос был просто примером того, как «решить» эту проблему.

Littlefoot 28.05.2019 23:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
35
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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  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, вы не получите желаемого результата

Да, я думаю, что мне придется это сделать, спасибо за помощь с этим.

Branden 28.05.2019 23:20

Если в таблице фактов (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;

Если таблица фактов не существует, создайте ее, используя обычное табличное выражение: WITH state_info AS ( SELECT 'AL' AS state FROM DUAL UNION ALL SELECT 'AK' AS state FROM DUAL UNION ALL ...... SELECT 'WY' AS state FROM DUAL ) 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;

dreamwork 29.05.2019 21:44

Спасибо, я создал столбец в одной из наших таблиц для отслеживания состояний, и это сработало.

Branden 31.05.2019 00:26
Ответ принят как подходящий
     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; 

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

Другие вопросы по теме