如何在SQL中合并两个表并对具有相同ID的值求和?

如何在SQL中合并两个表并对具有相同ID的值求和?,sql,sqlite,Sql,Sqlite,我是新来的SQL抱歉,如果这个问题最终变得微不足道 我有两张桌子: 表1“客户”: CREATE TABLE customer (ID, Name, Surname); INSERT INTO customer (ID, Name, Surname) VALUES (1, 'Smith', 'Hulk'), (2, 'Jake', 'Brook'), (3, 'Vladimir', 'Computin'), (4, 'Joe', 'Door'); CREATE TABLE pay

我是新来的SQL抱歉,如果这个问题最终变得微不足道

我有两张桌子:

表1“客户”:

 CREATE TABLE customer (ID, Name, Surname);
 INSERT INTO customer (ID, Name, Surname)
 VALUES (1, 'Smith', 'Hulk'),
 (2, 'Jake', 'Brook'),
 (3, 'Vladimir', 'Computin'),
 (4, 'Joe', 'Door');
 CREATE TABLE payment (payment_id, customer_id, payment_date, payment_amount);
 INSERT INTO payment (payment_id, customer_id, payment_date, payment_amount)
 VALUES (1, 1, "11/09/2011", 100),
 (2, 2, "15/10/2013", 50),
 (3, 4, "2/1/2011", 30),
 (4, 3, "12/09/2011", 200),
 (5, 2, "15/10/2013", 200),
 (6, 3, "2/1/2011", 10),
 (7, 1, "11/09/2011", 120),
 (8, 4, "15/10/2013", 100);
CREATE TABLE payment (Name, Surname, total_payments);
 INSERT INTO payment (Name, Surname, total_payments)
 VALUES ('Smith', 'Hulk',220),
 ('Jake', 'Brook', 250),
 ('Vladimir', 'Computin', 210),
 ('Joe', 'Door', 130)
SELECT payments.ID, sum(payments.payment_amount)
FROM payments
GROUP BY payments.ID
表2“付款”:

 CREATE TABLE customer (ID, Name, Surname);
 INSERT INTO customer (ID, Name, Surname)
 VALUES (1, 'Smith', 'Hulk'),
 (2, 'Jake', 'Brook'),
 (3, 'Vladimir', 'Computin'),
 (4, 'Joe', 'Door');
 CREATE TABLE payment (payment_id, customer_id, payment_date, payment_amount);
 INSERT INTO payment (payment_id, customer_id, payment_date, payment_amount)
 VALUES (1, 1, "11/09/2011", 100),
 (2, 2, "15/10/2013", 50),
 (3, 4, "2/1/2011", 30),
 (4, 3, "12/09/2011", 200),
 (5, 2, "15/10/2013", 200),
 (6, 3, "2/1/2011", 10),
 (7, 1, "11/09/2011", 120),
 (8, 4, "15/10/2013", 100);
CREATE TABLE payment (Name, Surname, total_payments);
 INSERT INTO payment (Name, Surname, total_payments)
 VALUES ('Smith', 'Hulk',220),
 ('Jake', 'Brook', 250),
 ('Vladimir', 'Computin', 210),
 ('Joe', 'Door', 130)
SELECT payments.ID, sum(payments.payment_amount)
FROM payments
GROUP BY payments.ID
所需输出:

 CREATE TABLE customer (ID, Name, Surname);
 INSERT INTO customer (ID, Name, Surname)
 VALUES (1, 'Smith', 'Hulk'),
 (2, 'Jake', 'Brook'),
 (3, 'Vladimir', 'Computin'),
 (4, 'Joe', 'Door');
 CREATE TABLE payment (payment_id, customer_id, payment_date, payment_amount);
 INSERT INTO payment (payment_id, customer_id, payment_date, payment_amount)
 VALUES (1, 1, "11/09/2011", 100),
 (2, 2, "15/10/2013", 50),
 (3, 4, "2/1/2011", 30),
 (4, 3, "12/09/2011", 200),
 (5, 2, "15/10/2013", 200),
 (6, 3, "2/1/2011", 10),
 (7, 1, "11/09/2011", 120),
 (8, 4, "15/10/2013", 100);
CREATE TABLE payment (Name, Surname, total_payments);
 INSERT INTO payment (Name, Surname, total_payments)
 VALUES ('Smith', 'Hulk',220),
 ('Jake', 'Brook', 250),
 ('Vladimir', 'Computin', 210),
 ('Joe', 'Door', 130)
SELECT payments.ID, sum(payments.payment_amount)
FROM payments
GROUP BY payments.ID
以下是我尝试过的:

 CREATE TABLE customer (ID, Name, Surname);
 INSERT INTO customer (ID, Name, Surname)
 VALUES (1, 'Smith', 'Hulk'),
 (2, 'Jake', 'Brook'),
 (3, 'Vladimir', 'Computin'),
 (4, 'Joe', 'Door');
 CREATE TABLE payment (payment_id, customer_id, payment_date, payment_amount);
 INSERT INTO payment (payment_id, customer_id, payment_date, payment_amount)
 VALUES (1, 1, "11/09/2011", 100),
 (2, 2, "15/10/2013", 50),
 (3, 4, "2/1/2011", 30),
 (4, 3, "12/09/2011", 200),
 (5, 2, "15/10/2013", 200),
 (6, 3, "2/1/2011", 10),
 (7, 1, "11/09/2011", 120),
 (8, 4, "15/10/2013", 100);
CREATE TABLE payment (Name, Surname, total_payments);
 INSERT INTO payment (Name, Surname, total_payments)
 VALUES ('Smith', 'Hulk',220),
 ('Jake', 'Brook', 250),
 ('Vladimir', 'Computin', 210),
 ('Joe', 'Door', 130)
SELECT payments.ID, sum(payments.payment_amount)
FROM payments
GROUP BY payments.ID
这将对具有相同ID的表“付款”中的条目求和

但是,我不知道如何使用ID,以便在总付款前显示姓名(如所需输出)


任何帮助都将不胜感激

您需要将
客户
左侧
加入到
付款
和聚合:

SELECT c.Name, c.Surname, 
       COALESCE(SUM(p.payment_amount), 0) payment_amount
FROM customer c LEFT JOIN payment p
ON p.customer_id = c.id
GROUP BY c.ID, c.Name, c.Surname
SELECT c.ID, c.Name, c.SurName, sum(p.payment_amount)
FROM clients c LEFT JOIN
     payments p
     ON c.id = p.customer_id
GROUP BY c.ID, c.Name, c.SurName;
请参阅。
结果:


您需要将
customer
LEFT
加入到
payment
并聚合:

SELECT c.Name, c.Surname, 
       COALESCE(SUM(p.payment_amount), 0) payment_amount
FROM customer c LEFT JOIN payment p
ON p.customer_id = c.id
GROUP BY c.ID, c.Name, c.Surname
SELECT c.ID, c.Name, c.SurName, sum(p.payment_amount)
FROM clients c LEFT JOIN
     payments p
     ON c.id = p.customer_id
GROUP BY c.ID, c.Name, c.SurName;
请参阅。
结果:


您可能需要
JOIN
将它们引入查询,然后进行适当的聚合:

SELECT c.Name, c.Surname, 
       COALESCE(SUM(p.payment_amount), 0) payment_amount
FROM customer c LEFT JOIN payment p
ON p.customer_id = c.id
GROUP BY c.ID, c.Name, c.Surname
SELECT c.ID, c.Name, c.SurName, sum(p.payment_amount)
FROM clients c LEFT JOIN
     payments p
     ON c.id = p.customer_id
GROUP BY c.ID, c.Name, c.SurName;
注意:使用相关子查询通常更快:

SELECT c.*, 
       (SELECT SUM(p.payment_amount)
        FROM payments p
        WHERE c.id = p.customer_id
       ) as total_payments
FROM clients c ;

特别是,这可以有效地使用
付款(客户id、付款金额)的索引

您可以需要
加入
以将其纳入查询,然后进行适当的聚合:

SELECT c.Name, c.Surname, 
       COALESCE(SUM(p.payment_amount), 0) payment_amount
FROM customer c LEFT JOIN payment p
ON p.customer_id = c.id
GROUP BY c.ID, c.Name, c.Surname
SELECT c.ID, c.Name, c.SurName, sum(p.payment_amount)
FROM clients c LEFT JOIN
     payments p
     ON c.id = p.customer_id
GROUP BY c.ID, c.Name, c.SurName;
注意:使用相关子查询通常更快:

SELECT c.*, 
       (SELECT SUM(p.payment_amount)
        FROM payments p
        WHERE c.id = p.customer_id
       ) as total_payments
FROM clients c ;
特别是,这可以有效地使用
付款索引(客户id、付款金额)

尝试:

select c.Name, c.Surname, SUM(p.payment_amount)
from Payments as p, Clients as c
where p.customerID = c.ID
group by c.Name, c.Surname
我想它会起作用的

试试:

select c.Name, c.Surname, SUM(p.payment_amount)
from Payments as p, Clients as c
where p.customerID = c.ID
group by c.Name, c.Surname

我想它会起作用的

你需要先把两张桌子连在一起。您需要找到表之间的“关系”,以便能够与付款的客户一起汇总付款。在开始将GROUPBY子句应用于查询之前,首先编写连接以关联数据。在这种情况下,您可以通过客户连接表。您需要首先将两个表连接在一起。您需要找到表之间的“关系”,以便能够与付款的客户一起汇总付款。在开始将GROUPBY子句应用于查询之前,首先编写连接以关联数据。在这种情况下,您可以通过客户加入您的表格。\u id感谢您的回复!从技术上讲,它是有效的,但由于某种原因,它改变了罗尔斯的顺序/谢谢你的回复!从技术上讲,它是有效的,但由于某种原因,它改变了罗尔斯的顺序/谢谢你的回复,它工作得很好!谢谢你让我知道这件事!!伟大的资源!很遗憾,我只能接受一个答案。@Geom你接受最新答案有什么原因吗?没有技术原因。这只是奥卡姆的剃须刀。不知何故,最简单的解决方案总是吸引人。不幸的是,我还不熟悉“COALESCE”,所以我更好地理解了其他解决方案中的情况。我希望有一种方法可以接受这两个答案,因为这两个答案都给了我很多帮助@Geom…不熟悉“合并”。。。那你应该查一下。您需要coalesce(),以防客户没有任何付款,因此您得到的结果是0,而不是NULL。我会的,谢谢!谢谢你的回复,它工作得很好!谢谢你让我知道这件事!!伟大的资源!很遗憾,我只能接受一个答案。@Geom你接受最新答案有什么原因吗?没有技术原因。这只是奥卡姆的剃须刀。不知何故,最简单的解决方案总是吸引人。不幸的是,我还不熟悉“COALESCE”,所以我更好地理解了其他解决方案中的情况。我希望有一种方法可以接受这两个答案,因为这两个答案都给了我很多帮助@Geom…不熟悉“合并”。。。那你应该查一下。您需要coalesce(),以防客户没有任何付款,因此您得到的结果是0,而不是NULL。我会的,谢谢!非常感谢。这正是我要找的!非常感谢。这正是我要找的!