Строка исключена из-за оператора JOIN ON- Oracle SQL - PullRequest
0 голосов
/ 26 марта 2020

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

Как я могу изменить это так, чтобы месяц за месяц вводился с пустым или нулевым значением счета-фактуры и заплаченной суммой, заполняемым суммой.

SELECT INV.YEAR, INV.MONTH, INV.CATEGORY, INV.INV_AMT AS INV_AMT,  PAY.PAID AS PAID

FROM (
SELECT YEAR, to_char(INV_date, 'Month') AS MONTH, CATEGORY, SUM(INV_AMT) AS INV_AMT
FROM INV
WHERE DATE > '01-JAN-2020' AND CATEGORY = 'Insurance'
group by YEAR, to_char(co_date, 'Month'), CATEGORY ) INV

LEFT JOIN (
SELECT YEAR,  to_char(Pay_date, 'Month') AS MONTH, CATEGORY, SUM(PAID) AS PAID
FROM PAY
group by YEAR, to_char(Pay_date, 'Month'), CATEGORY) PAY
ON PAY.YEAR = INV.YEAR AND INV.MONTH = INV.MONTH AND PAY.CATEGORY = INV.CATEGORY 

ТАБЛИЦА СЧЕТА:

YEAR    MONTH       CATEGORY      INV_AMT 
2020    February    Insurance    $670.00 
2020    January     Insurance    $2,887.00 

ПЛАТНЫЙ СТОЛ:

YEAR    MONTH       CATEGORY       PAID 
2020    March       Insurance    $5,400.00 
2020    February    Insurance    $2,953.00 
2020    January     Insurance    $5,831.00 

Текущий результат:

YEAR    MONTH   CATEGORY         INV_AMT        PAID 
2020    February    Insurance    $670.00        $2,953.00 
2020    January     Insurance    $2,887.00     $5,831.00 

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

YEAR    MONTH   CATEGORY         INV_AMT        PAID 
2020    March       Insurance                  $5,400.00 
2020    February    Insurance    $670.00        $2,953.00 
2020    January     Insurance    $2,887.00     $5,831.00 

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Вы должны использовать RIGHT JOIN вместо LEFT JOIN или, что еще лучше, попробовать FULL OUTER JOIN

SELECT INV.YEAR, INV.MONTH, INV.CATEGORY, INV.INV_AMT AS INV_AMT,  PAY.PAID AS PAID

FROM (
SELECT YEAR, to_char(INV_date, 'Month') AS MONTH, CATEGORY, SUM(INV_AMT) AS INV_AMT
FROM INV
WHERE DATE > '01-JAN-2020' AND CATEGORY = 'Insurance'
group by YEAR, to_char(co_date, 'Month'), CATEGORY ) INV

FULL OUTER JOIN (SELECT YEAR,  to_char(Pay_date, 'Month') AS MONTH, CATEGORY, SUM(PAID) AS PAID
FROM PAY
group by YEAR, to_char(Pay_date, 'Month'), CATEGORY) PAY
ON PAY.YEAR = INV.YEAR AND INV.MONTH = INV.MONTH AND PAY.CATEGORY = INV.CATEGORY 
0 голосов
/ 26 марта 2020

На основании размещенных вами образцов данных; сортировка только для более красивого отображения, вы бы использовали свой собственный.

SQL> with
  2  invoice (year, month, category, inv_amt) as
  3    (select 2020, 'feb', 'insurance', 670 from dual union all
  4     select 2020, 'jan', 'insurance', 2887 from dual
  5    ),
  6  paid (year, month, category, paid) as
  7    (select 2020, 'mar', 'insurance', 5400 from dual union all
  8     select 2020, 'feb', 'insurance', 2953 from dual union all
  9     select 2020, 'jan', 'insurance', 5831 from dual
 10    )
 11  select p.year, p.month, p.category, i.inv_amt, p.paid
 12  from paid p left join invoice i on i.year = p.year
 13    and i.month = p.month
 14  order by decode(p.month, 'mar', 1, 'feb', 2, 'jan', 3);

      YEAR MON CATEGORY     INV_AMT       PAID
---------- --- --------- ---------- ----------
      2020 mar insurance                  5400
      2020 feb insurance        670       2953
      2020 jan insurance       2887       5831

SQL>
...