2016-06-06 2 views
0

Я пытаюсь получить общий счет с помощью оператора UNION, но он дает неверный счет.Как получить счет с помощью оператора UNION

select count(*) as companyRatings from (
select count(*) hrs from (
select distinct hrs from companyA 
) 
union   
select count(*) financehrs from (
select distinct finance_hrs from companyB 
) 
union   
select count(*) hrids from (
select regexp_substr(hr_id,'[^/]+',1,3) hrid from companyZ 
) 
union   
select count(*) cities from (
select regexp_substr(city,'[^/]+',1,3) city from companyY 
) 
); 

индивидуальный запрос работает нормально, но общий счет не соответствует.

отдельные результаты здесь: 12 19 3 6 присутствует общее количество: 31

Фактическое общее количество: 40. , так что есть альтернативное решение без оператора UNION?

+2

BTW не делает отдельную таблицу для каждой компании. –

+1

Используйте union all вместо union и выберите sum (hrs) вместо select count в основном запросе. –

+0

@PavelGatnar - для этой работы вся таблица должна иметь тот же тип столбца, который невозможен, так как выводятся его третья и четвертая таблицы. – Utsav

ответ

0

Редактировать. Обновленный запрос с использованием Sum

select sum(cnt) as companyRatings from 
(
    select count(*) as cnt from (select distinct hrs from companyA) 
    union all   
    select count(*) as cnt from (select distinct finance_hrs from companyB) 
    union all   
    select count(*) as cnt from (select regexp_substr(hr_id,'[^/]+',1,3) hrid from companyZ) 
    union all  
    select count(*) as cnt from (select regexp_substr(city,'[^/]+',1,3) city from companyY) 
) 

Предыдущий ответ:

Попробуйте

SELECT (
     SELECT count(*) hrs 
     FROM (
      SELECT DISTINCT hrs 
      FROM companyA 
      ) 
     ) 
     + 
     (
     SELECT count(*) financehrs 
     FROM (
      SELECT DISTINCT finance_hrs 
      FROM companyB 
      ) 
     ) 
     + 
     (
     SELECT count(*) hrids 
     FROM (
      SELECT regexp_substr(hr_id, '[^/]+', 1, 3) hrid 
      FROM companyZ 
      ) 
     ) 
     + 
     (
     SELECT count(*) cities 
     FROM (
      SELECT regexp_substr(city, '[^/]+', 1, 3) city 
      FROM companyY 
      ) 
     ) 
AS total_count 
FROM dual 
+0

Я пробовал этот способ, сначала добавили два запроса, но третий и четвертый запросы не добавили. – Sri

+0

Проверьте обновленный ответ на 'sum'. Если вы не работаете, попробуйте использовать внутренний запрос сначала без суммы. Я очень сомневаюсь, что любой из последних двух ваших запросов может быть неправильным – Utsav

1

Чтобы добавить значения, которые вы хотите использовать +. UNION - это набор данных.

select 
    (select count(distinct hrs) from companyA) 
    + 
    (select count(distinct finance_hrs) from companyB) 
    + 
    (select count(regexp_substr(hr_id,'[^/]+',1,3)) from companyZ) 
    + 
    (select count(regexp_substr(city,'[^/]+',1,3)) from companyY) 
    as total 
from dual; 

Но я согласен с juergen d; вы не должны иметь отдельных таблиц для компании в первую очередь.

+0

он не работает – Sri

+0

Спасибо за этот точный комментарий. Вы говорите, что отдельные запросы retur n, но знак плюса не может их добавить? Это маловероятно. –

+0

Да. Если есть альтернативное решение? – Sri

Смежные вопросы