Данные из таблицы 2 за месяц, когда в таблице 1 нет данных

#oracle #oracle11g #oracle12c

#Oracle #oracle11g #oracle12c

Вопрос:

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

  • Таблица содержит данные за 3 месяца (будут добавляться каждый день, чтобы по прошествии месяцев добавлялось больше данных и за ближайшие месяцы)

таблица amp; B содержит данные за 12 месяцев (за полный год).

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

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

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

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

Таблица 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
  

Комментарии:

1. Каков ваш ожидаемый результат? Покажите это в табличной форме

2. @KaushikNayak пожалуйста, проверьте мою правку

3. Итак, что, если для данного идентификатора и месяца value отличается между таблицами 1 и таблицей 2? они всегда будут одинаковыми?

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

5. Хорошо, на мгновение, глядя на ваш ожидаемый результат, я подумал, что вы суммируете значения table1 и table2. похоже, что это не так..

Ответ №1:

Попробуйте 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');
  

Комментарии:

1. как работает объединение в этом случае, не могли бы вы, пожалуйста, помочь мне с несколькими строками описания

2. Моя ошибка, не объединение ВСЕХ, просто ОБЪЕДИНЕНИЕ. Суть в том, что вы выбираете все необходимые вам данные из таблиц B и A и объединяете их с помощью UNION, который удаляет дубликаты.

3. Спасибо за разъяснение, на данный момент я не могу использовать union, есть ли у них какой-либо другой способ добиться того же?

4. Почему вы не можете это использовать? Существуют ли какие-либо особые требования?

5. Спасибо за объяснение, причина, по которой я не могу использовать объединение, заключается в том, что я реализую в tableau, где я не вижу опции объединения, но фон тот же, поэтому спросил вас, есть ли у них какой-либо другой вариант

Ответ №2:

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

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

 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 
  

ДЕМОНСТРАЦИЯ

Комментарии:

1. Спасибо, Каушик, да, вы правы, я не опубликовал запрос, потому что я манипулирую всем процессом в Tableau и где я не получаю ожидаемые данные из-за упомянутых проблем, поэтому планирую настроить с использованием логики SQL, поэтому не могу предоставить полную информацию, Спасибо за вашу помощь, я внедрю и обновлю вам результаты

Ответ №3:

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

 create view A_B as
  

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