将 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。
由于SUM
和GROUP 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 查询
有任何 MySQL 查询来更新/替换 Group By 表点到其他 MySQL 表
MariaDB 查询 SUM() OVER (PARTITION BY)