将 GROUPED BY SUM 查询与其他查询链接(使用 JOIN 或子查询)

Posted

技术标签:

【中文标题】将 GROUPED BY SUM 查询与其他查询链接(使用 JOIN 或子查询)【英文标题】:Link GROUPED BY SUM query with other query (with either JOIN or subquery) 【发布时间】:2020-01-08 09:21:33 【问题描述】:

我有以下表格:

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 添加到第一个查询的输出中,通过tax_bill_nr 链接Remission 和Payments-sum。

由于SUMGROUP BY 的构造,我不知道该怎么做。我尝试过使用子查询,但随后出现缺少右括号太多值等错误,以及其他神秘的语法错误(这意味着有问题,但 Oracle不知道具体是什么)..

上述查询是 Oracle SQL(如果相关,Oracle 数据库服务器使用版本 12)。

【问题讨论】:

【参考方案1】:

您可以简单地使用 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;

干杯!!

【讨论】:

【参考方案2】:

由于您有 2 组数据作为结果,因此根据其中存在的公共列将它们相互连接。 例如

        Query 1 Result

列--> a、b、c、d

        Query 2 Result

列--> a, b, d, e, sum(f)

      Desired result

列 --> a, b, c, d, e, sum(f)

在上述场景中,列 a 和列 B 在两个结果之间是共同的,那么我们可以在两个查询的输出上再编写一个内连接查询。

*Select * (query1) as temp1 内连接 (query2) as temp2 on temp1.a=temp2.​​a and temp1.b=temp2.​​b ;*

在您的情况下,列 tax_bill_nr 很常见,因此您可以根据此列连接两个查询的输出。

【讨论】:

以上是关于将 GROUPED BY SUM 查询与其他查询链接(使用 JOIN 或子查询)的主要内容,如果未能解决你的问题,请参考以下文章

使用函数 SUM() 和 Group by 将 Mysql 查询转换为 SQL 查询

SUM GROUP BY与多个表上的子查询

有任何 MySQL 查询来更新/替换 Group By 表点到其他 MySQL 表

MariaDB 查询 SUM() OVER (PARTITION BY)

oracle查询选择语句——count、sum、order by、group by

ORDER 查询 BY 两个变量:sum() 和 date