2017-06-23 102 views
0

我有2个数据表。SQL计数和总数问题

第一张表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

+0

不知道这是什么类型的数据库,但我很惊讶,它按原样运行。您正在选择不在组中的列。另外你的where子句使用的是cus.user_id而不是cus_id – Simon

+0

数据库是mysql。 user_id是别的东西。对于两个客户,'user_id ='2'' – John

+0

您能否提供样本数据?您声明客户2有3张发票。我们可以用那种风格的数据。似乎问题是数据相关和/或您的连接逻辑不正确。 –

回答

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' 
+0

我得到:'#1064 - 'FROM发票 WHERE cus.user_id ='2' GROUP BY cus.cus_id )in O'on第7行' – John

+0

我仍然得到相同的回应:'回应是对于客户1:总发票= 1,总= 50回应是对于客户1:总发票= 0,总=(空)' – John

+0

这是一个样本:http://sqlfiddle.com/#!9/a9f9f/1 – John

0

如果您使用的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; 
+0

不,我正在使用MySQL – John

+0

对于mySQL,请使用COALESCE()或IFNULL()而不是ISNULL() –

-1

这是一个简单的SQL查询,因为我明白你的问题。我假设CustomerID在两个表中。我认为这个查询会帮助你。

选择i.CustomerID,i.CustomerName,COUNT(i.InvoiceID)为A,SUM(i.invoicetotal)为b 从流失客户C,发票我 其中i.CustomerID = c.CustomerID 组由我.CustomerID

+0

我的声明有什么区别? – John