【问题标题】:SQL count and sum issueSQL 计数和求和问题
【发布时间】:2026-02-16 16:35:01
【问题描述】:

我有 2 个数据表。

第一个表cus 包含客户数据。第二个表invoice 包含客户创建的发票。

我想选择创建的发票总数和每个客户的发票总和。

这是我所拥有的:

SELECT cus.cus_id, cus.name_cus, count(invoice.id) as id2, CONCAT('€ ', ROUND(SUM(invoice.total),2)) as total, cus.id 
FROM cus 
LEFT OUTER JOIN invoice ON cus.cus_id = invoice.cus_id 
WHERE cus.user_id='2' 
GROUP BY cus.cus_id

为了测试这一点,我在我的数据库中添加了一些数据。第一位客户有 2 张发票,总金额为 100 (50+50)。 第二个客户有 3 张发票,总金额为 30 (10+10+10)。

但是 SQL 代码没有显示这些结果。

针对客户 1 的响应:总发票 = 1,总计 = 50 响应是针对客户 1:总发票 = 0,总计 =(空)

有人知道我的 SQL 语句有什么问题吗?

我使用的数据库类型是 MySQL。

这是一个示例:http://sqlfiddle.com/#!9/a9f9f/1

【问题讨论】:

  • 不确定这是哪种类型的数据库,但我很惊讶它按原样运行。您正在选择不在分组依据中的列。您的 where 子句也使用 cus.user_id 而不是 cus_id
  • 数据库是mysql。 user_id 是别的东西。对于这两个客户,user_id = '2'
  • 你能提供样本数据吗?您声明客户 2 有 3 张发票。我们可以那种风格的数据。似乎问题与数据相关和/或您的加入逻辑不正确。
  • 你知道像 jsfiddle 这样的网站,我可以在其中插入示例数据
  • 这是一个示例:sqlfiddle.com/#!9/a9f9f/1

标签: mysql sql


【解决方案1】:

首先尝试将您的发票计数和总和分组为子查询,例如:

SELECT cus.cus_id, cus.name_cus, inv.invoice_count, inv.invoice_total, cus.id
FROM cus
LEFT OUTER JOIN 
(
    SELECT inv.cus_id, 
    COUNT(inv.id) AS invoice_count,
    CONCAT('€ ', ROUND(SUM(inv.total),2)) AS invoice_total
    FROM invoice inv
    GROUP BY inv.cus_id
) inv
ON cus.cus_id = inv.cus_id
WHERE cus.user_id='2' 

【讨论】:

  • 我得到:#1064 - There is something wrong in the syntax at 'FROM invoice WHERE cus.user_id='2' GROUP BY cus.cus_id ) in O' on line 7
  • 我仍然得到相同的回复:The response is for customer 1: total invoices = 1, total = 50 The response is for customer 1: total invoices = 0, total = (empty)
  • 再试一次,内部 where 子句导致 MySQL 出现问题。感谢您提供出色的 SQLFiddle 示例。
  • 戈登。您编辑的语句在 SQLFiddle 中有效。但是在我的mysql数据库中结果还是一样
  • 你的结果有什么问题,返回的行数,invoice_count,invoice_total?
【解决方案2】:

如果您使用的是 SQL Server,那么您的查询应该是这样的 --

SELECT C.cus_id
    ,C.name_cus
    ,Count(I.id) AS NumberOfInvoices
    ,IsNull(Sum(I.Price), 0) AS TotalPrice
FROM Customer C
LEFT JOIN Invoice I ON C.cus_id = I.cus_id
GROUP BY C.cus_id, C.name_cus
ORDER BY C.cus_id;

【讨论】:

  • 不,我正在使用 MySQL
  • 对于 mySQL 使用 COALESCE() 或 IFNULL() 而不是 ISNULL()
【解决方案3】:

这是一个简单的 sql 查询,因为我了解您的问题。我假设 CustomerID 在两个表中。我认为这个查询会对你有所帮助。

选择 i.CustomerID,i.CustomerName,COUNT(i.InvoiceID) 作为 A,SUM(i.invoicetotal) 作为 b 来自 Cus c,发票 i 其中 i.CustomerID=c.CustomerID 按 i.CustomerID 分组

【讨论】:

  • 我的陈述有什么不同?