Связать запрос GROUPED BY SUM с другим запросом (с помощью JOIN или подзапроса) - PullRequest
0 голосов
/ 08 января 2020

У меня есть следующие таблицы:

Payments
payment_id   amount   tax_bill_nr   fk_person_id   payment_type   ...

Person
person_id   name   address   ...

Remission
remission_id   tax_bill_nr   fk_person_id   taxing_year   ...

Remission_State
fk_remission_id   created_on   ...

У меня уже есть огромный запрос на Remissions, который объединяет все виды данных из других таблиц. На самом деле это более 300 строк (да, модель базы данных отстой ...), но все остальные данные не имеют отношения к моей текущей проблеме. В настоящее время запрос выполняется следующим образом:

SELECT *
FROM (SELECT remission_id,
             tax_bill_nr,
             ...,
             row_number() OVER (PARITION BY rr.remission_id ORDER BY rs.created_on) rn
      FROM Remission r
      LEFT JOIN Remission_State rs ON rs.fk_remission_id = r.remission_id
      LEFT JOIN ...
      ORDER BY taxing_year, remission_id
) WHERE rn = 1;

Я создал отдельный запрос, который получает сумму платежей, сгруппированных по tax_bill_nr. Этот разделенный запрос также получит данные tax_bill_number и Person:

SELECT DISTINCT temp.tax_bill_nr,
                pers.person_id,
                temp.amount_sum AS total_amount
FROM (SELECT p.tax_bill_number, sum(p.amount) AS amount_sum
      FROM Payments p
      WHERE p.payment_type = 6 -- Remission_Payment
      GROUP BY p.tax_bill_nr) temp
LEFT JOIN Payments p2 ON temp.tax_bill_nr = p2.tax_bill_number
LEFT JOIN Person pers ON pers.person_id = p2.fk_person_id;

Я хочу объединить два запроса. Или, если быть более точным, добавьте total_amount к выводу первого запроса, связав сумму Remission и Payments на tax_bill_nr.

Из-за конструкции SUM и GROUP BY, Я не уверен, как это сделать, хотя. Я пытался с подзапросом, но затем я получаю ошибки, такие как отсутствует правильная скобка , слишком много значений , и другие синтаксические ошибки crypti c (что означает, что что-то не так, но Oracle не знает точно, что) ..

Вышеприведенные запросы Oracle SQL (и, если это уместно, сервер баз данных Oracle использует версию 12).

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Вы можете просто использовать CTE (общее табличное выражение) для кода уборщика следующим образом:

-- CTE
WITH AMOUNTS (tax_bill_number, amount_sum)
AS
(SELECT p.tax_bill_number, sum(p.amount) AS amount_sum
      FROM Payments p
      WHERE p.payment_type = 6 -- Remission_Payment
      GROUP BY p.tax_bill_nr)
--
SELECT *
FROM (SELECT remission_id,
             tax_bill_nr,
             ...,
             A.amount_sum, -- THIS IS YOUR REQUIRED DATA
             row_number() OVER (PARITION BY rr.remission_id ORDER BY rs.created_on) rn
      FROM Remission r
      LEFT JOIN Remission_State rs ON rs.fk_remission_id = r.remission_id
      LEFT JOIN ...
      -- ADDED FOLLOWING JOIN 
      LEFT JOIN AMOUNTS A ON (A.tax_bill_number = tax_bill_nr)
      ORDER BY taxing_year, remission_id
) WHERE rn = 1;

Cheers !!

0 голосов
/ 08 января 2020

Поскольку у вас есть 2 набора данных в качестве результата, соедините их друг с другом на основе общего столбца, присутствующего в нем. Например,

        Query 1 Result

Столбцы -> a, b, c, d

        Query 2 Result

Столбцы -> a, b, d, e, сумма (f)

      Desired result

Столбцы -> a, b, c, d, e, сумма (f)

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

* Выберите * (query1) в качестве внутреннего соединения temp1 (query2) как temp2 на temp1.a = temp2.a и temp1.b = temp2. b; *

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

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