count возвращает <<air>> когда нечего группировать по - PullRequest
0 голосов
/ 01 июля 2019

Вот мой SQL:

select 
  count(*)
from
  sysdba.dw_cmap_arf_tmp
left join SYSDBA.TABLE1 rrc 
  on rrc.part_work_order = pwo
left join sysdba.TABLE2 R
  on rrc.run_number = R.RUN_NUMBER
where 
  upper(run_type) like '%FEE%'
group by 
  pwo;

Когда нечего группировать, count возвращает --air--.Это нулевое и не пустое.Я изменил приведенный выше SQL следующим образом, чтобы доказать:

select 
  '>>' || count(*) || '<<' as blah
from
  sysdba.dw_cmap_arf_tmp
left join SYSDBA.TABLE1 rrc 
  on rrc.part_work_order = pwo
left join sysdba.TABLE2 R
  on rrc.run_number = R.RUN_NUMBER
where 
  upper(run_type) like '%ANNEAL%'
group by 
  pwo;

Когда я, однако, пишу вышеприведенное утверждение для выполнения обновления, я получаю нулевое значение.Итак, попытался объединиться, но получил то же самое.

Кто-нибудь знает, что я могу сделать, чтобы заменить --air-- на ноль или 0?Спасибо!

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

Спасибо!

1 Ответ

1 голос
/ 01 июля 2019

Это то, что у вас есть в настоящее время (на основе таблицы Скотта EMP): поскольку нет отдела 50, вы получаете не выбранных строк (то есть air , о котором вы говорите, Я полагаю).

SQL> with your_current_query as
  2    (select count(*) cnt
  3     from emp
  4     where deptno = &deptno
  5     group by job
  6    )
  7  select cnt
  8  from your_current_query;
Enter value for deptno: 50

no rows selected

Просто чтобы показать, что он действительно что-то возвращает, если там есть какие-то данные:

SQL> /
Enter value for deptno: 30

       CNT
----------
         4
         1
         1

SQL>

OK;теперь, чтобы сделать что-то в ситуации, когда не выбраны ни одной строки, используйте объединение с фиктивной строкой, выбранной из таблицы DUAL:

SQL> with your_current_query as
  2    (select count(*) cnt
  3     from emp
  4     where deptno = &deptno
  5     group by job
  6    )
  7  select cnt
  8  from your_current_query
  9  -- add this: if YOUR_CURRENT_QUERY doesn't return anything, union it with
 10  -- a select from dual
 11  union all
 12  select 0
 13  from dual
 14  where 0 = (select count(*) from your_current_query);
Enter value for deptno: 50

       CNT
----------
         0

SQL>

Итак: даже еслив отделе 50 нет сотрудников, в результате вы получили 0.

Опять же, чтобы показать, что происходит, когда есть несколько строк:

SQL> /
Enter value for deptno: 30

       CNT
----------
         4
         1
         1

SQL>

Наконец, ваш запрос -переписано - будет выглядеть так:

with your_current_query as
  (select 
    count(*) cnt
   from
     sysdba.dw_cmap_arf_tmp
   left join SYSDBA.TABLE1 rrc 
     on rrc.part_work_order = pwo
   left join sysdba.TABLE2 R
     on rrc.run_number = R.RUN_NUMBER
   where 
     upper(run_type) like '%FEE%'
   group by 
     pwo
  )
select cnt from your_current_query
union all
select 0 
from dual
where 0 = (select count(*) from your_Current_query);

Посмотрите, поможет ли это.

...