Данные из таблицы 2 за месяц, когда их нет, данные из таблицы 1 - PullRequest
0 голосов
/ 06 марта 2019

У меня есть две таблицы A и B.

  • Таблица содержит данные за 3 месяца (будет добавляться каждый день, так как по прошествии нескольких месяцев будут добавляться дополнительные данные за ближайшие месяцы)
* Таблица 1006 * & B содержит данные за 12 месяцев (за полный год).

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

Когда я беру левое соединение, мне не хватает данных для 1 идентификатора за январь из таблицы 2, поскольку в таблице нет данных для идентификатора 1.

При правильном объединении я получаю данные за 12 месяцев для таблицы 2, поэтому в этом случае также применяется условие соединения month(table A. date)=month(table B. date). Я также теряю данные для идентификатора 1 из таблицы 2.

Мое требование - получить данные из таблиц1 и таблиц2 за месяцы в таблице1, и если в таблице нет данных за определенный месяц (например, за январь), то также требуются данные за январь из таблицы 2.

Таблица 1

ID Date         value

1  01-Feb-2019  100
2  01-Jan-2019  101
2  01-Feb-2019  102

Таблица 2

ID Date         value
1  01-Jan-2019  101
1  01-Feb-2019  100
1  01-Mar-2019  100
2  01-Jan-2019  101
2  01-Jan-2019  101
2  01-Feb-2019  102
2  01-Mar-2019  100
      .
      .
      .

This continues till dec 2019  

Здесь в приведенных выше примерах данных я не получаю данные за январь из таблицы 2.

Ожидаемый результат:

ID  Jan  Feb  Mar
1   101  201  100  //Here Jan value from table2
2   201  204  100

Ответы [ 3 ]

0 голосов
/ 06 марта 2019

Не уверен, как вы извлекаете значения, так как вы не показали фактический запрос, который дает ожидаемый результат.

Этот запрос, кажется, работает нормально, т.е. он дает то, что вы изначально хотели.

select  t2.id,t2.dt,coalesce(t1.value,t2.value) as value 
from t2  LEFT JOIN t1 ON
    to_char(t1.dt,'yyyymm') = to_char(t2.dt,'yyyymm') and
    t1.id = t2.id
  ORDER BY id,dt

Если вы добавите DISTINCT, вы получите одну запись на комбинацию id,month, если хотите удалить дубликаты.Вы также можете сделать group by id или все, что хотите, чтобы получить агрегацию

Обратите внимание, что приведенное ниже является единственной, если вы хотите предпочесть значение таблицы 1 над таблицей 2, иначе достаточно просто выбрать строки из t2

coalesce(t1.value,t2.value) as value 

Демо

0 голосов
/ 07 марта 2019

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

create view A_B as

выберите идентификатор, значение датыиз таблицы A объединение выбрать идентификатор, значение даты из таблицы B;

0 голосов
/ 06 марта 2019

Попробуйте UNION вместо:

select * from table A where Date between to_date('2019-01-01 00:00:00', 'YYYY.MM.DD HH24:MI:SS') and to_date('2019-01-31 23:59:59', 'YYYY.MM.DD HH24:MI:SS')
    union
select * from table B where Date between to_date('2019-01-01 00:00:00', 'YYYY.MM.DD HH24:MI:SS') and to_date('2019-01-31 23:59:59', 'YYYY.MM.DD HH24:MI:SS');
...