ORACLE - подсчет из двух таблиц с группировкой по

У меня есть две таблицы (table1 и table2), которые имеют общий столбец (номер day_code).

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

Таблица 1 (количество записей по day_code)

20160703 - 5
20160704 - 4

Таблица 2 (количество записей по day_code)

20160703 - 5
20160704 - 4

Мне нужно что-то вроде этого:

----------------------------------------------------
DAY_CODE | TABLE 1 | TABLE 2 |
20160703 |    5    |    5    |
20160704 |    4    |    4    |

Я использую этот запрос:

SELECT *
FROM
(
SELECT day_code, COUNT(day_code) AS TB1 FROM TABLE1 GROUP BY day_code
UNION ALL
SELECT day_code, COUNT(day_code) AS TB2 FROM TABLE2 GROUP BY day_code
) s
where day_code between 20160703 and 20160704

Я получаю это:

DAY_CODE  |  TB1
20160703  |   5
20160704  |   4
20160703  |   5
20160704  |   4

Вы можете помочь мне?

Заранее спасибо за советы, ЛР.


person Luís Ramos    schedule 06.07.2016    source источник
comment
Не совсем понятно, каковы ваши выходные требования. Одна строка из одной строки со значениями, разделенными вертикальной чертой? Таблица строк с заголовками столбцов DAY_CODE, TABLE 1 и TABLE 2 и одной строкой для DAY_CODE?   -  person mathguy    schedule 06.07.2016
comment
Прости @mathguy. Но у меня уже есть то, что я хочу. кордирко ответ правильный. ;)   -  person Luís Ramos    schedule 07.07.2016
comment
Понял. Правки a_horse помогли. Я тоже предложил ответ. Пожалуйста, отметьте ответ Кордико как правильный (он опубликовал свой первый); но после того, как вы это сделаете, вы можете попробовать оба ответа и посмотреть, какой из них работает быстрее в вашей конкретной ситуации.   -  person mathguy    schedule 07.07.2016


Ответы (2)


Пытаться:

SELECT coalesce( t1.day_code, t2.day_code) As daycode,
       nvl( cnt1, 0 ) cnt1,
       nvl( cnt2, 0 ) cnt2
FROM ( 
  SELECT day_code, count(*) cnt1
  FROM tab1
  GROUP BY day_code
) t1
FULL OUTER JOIN ( 
  SELECT day_code, count(*) cnt2
  FROM tab2
  GROUP BY day_code
) t2
ON t1.day_code = t2.day_code
ORDER BY 1
person krokodilko    schedule 06.07.2016
comment
Спасибо @kordiko. Идеально! ;) - person Luís Ramos; 07.07.2016
comment
Я рад, что мне холодно помочь. Если вам нравится этот ответ, пожалуйста, примите его, спасибо. - person krokodilko; 07.07.2016

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

with table1 (day_code, ct) as (
       select 20160703, 5 from dual union all
       select 20160704, 4 from dual union all
       select 20160705, 7 from dual
     ),
     table2 (day_code, ct) as (
       select 20160703, 5 from dual union all
       select 20160704, 8 from dual
     )
select *
from (select day_code, ct, 1 as t from table1
      union all
      select day_code, ct, 2 as t from table2
     )
pivot (min(ct) for t in (1 as table1, 2 as table2))
order by day_code;

Вывод:

  DAY_CODE     TABLE1     TABLE2
---------- ---------- ----------
  20160703          5          5
  20160704          4          8
  20160705          7
person mathguy    schedule 06.07.2016