объединить две таблицы и поворот в оракуле sql - PullRequest
1 голос
/ 10 апреля 2019

Мне нужно объединить две таблицы.

Таблица 1 содержит квартальные списки и содержит следующие столбцы:

Year, ID, ID2, Quarter(value can be 1, 2, 3, 4), Amount_Due_for_the_Quarter
2018, 001, 000, 3, $1.00
2018, 001, 000, 4, $2.000

Таблица 2 содержит ежемесячное представление списка и содержит следующие столбцы:

Year, ID, ID2, Mo (value is from January[1] to December[12]), Amount_Due_ per_Month
2018, 001,000, 8, $5.00
2018, 001,000, 10, $6.00
2018, 001,000, 11, $7.00

эти таблицы могут быть объединены с использованием ID и ID2 и года.1-я таблица может иметь или не иметь представления для всех кварталов.2-я таблица может иметь или не иметь представления для всех месяцев.1-й квартал соответствует месяцу 1, месяцу 2, 2-му кварталу для месяцев 4 и 5 и т. Д.

После объединения выведите:

Year, ID, ID2, Quarter, Amount Due for Qtr, jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
2018, 000, 001, 3, $1, null, null, null, null, null, null, null, $5.00, null, null, null, null
2018, 000, 001, 4, $2, null, null, null, null, null, null, null, null, null, $6.00, $7.00, null




select
      a.qtr,
      b.id,
      b.id2,
      nvl(b.Amount_Due_ per_Month,0)
from  tbl1  a
      left join tbl2 b
        on a.year = b.year
        and a.id = b.id
        and a.id2 = b.id2
  where a.year = '&year'
        and a.id = '&id'
        and a.id2 = '&id2';

, но при этом получите:

Year, ID, ID2, Quarter, Amount Due for Qtr, jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
2018, 000, 001, 3, $1, null, null, null, null, null, null, null, $5.00, null, $6.00, $7.00, null
2018, 000, 001, 4, null, null, null, null, null, null, null, null, null, null, $6.00, $7.00, null

1 Ответ

1 голос
/ 10 апреля 2019

Вы должны правильно соединять кварталы и месяцы, например, с floor((mo-1)/3) + 1 = qtr, таким образом вы назначаете январь, февраль, март на 1 квартал, апрель, май, июнь на 2 и т. Д. Как здесь:

select * 
  from (
    select * from t1 
      join t2 using (year, id, id2) 
      where id = '001' and id2 = '000' and floor((mo-1)/3) + 1 = qtr)
  pivot (max(amt_mth) for mo in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))

Демоверсия dbfiddle

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