1

我有 2 张桌子,客户和 Trans。

Customer
---------
c_id | cName | cSurname | cPbx | cGsm | cLastVisitDate

Trans
------
t_id | c_id | tDate | tPaymentAmount | tSaleAmount

我想选择债务大于零且自给定日期以来未进行交易的客户。

例如“列出自 2012 年 1 月 20 日以来欠债且未访问过的客户”

这就是我试图解决的方法,但它不起作用。

select Customer.c_id, SUM (saleAmount - paymentAmount) as totalDebt, 
cLastVisitDate, 
cName, 
cSurName, 
cPbx, 
cGsm 
from Customer, Trans 
where customer.c_id = trans.c_id AND cLastVisitDate < ?

这给出了以下错误。

'CUSTOMER.C_ID' 无效。当 SELECT 列表至少包含一个聚合时,所有条目都必须是有效的聚合表达式。

我也找到了一个解决方案,它将查询与非聚合列分组cLastVisitDate cName cSurname cPbx cGsm

 select Customer.c_id, SUM (saleAmount - paymentAmount) as totalDebt, 
    cLastVisitDate, 
    cName, 
    cSurName, 
    cPbx, 
    cGsm 
    from Customer, Trans 
    where customer.c_id = trans.c_id AND cLastVisitDate < ?
    group by customer.c_id, cLastVisitDate cName cSurname cPbx cGsm

此解决方案有效,但似乎不是优雅的方法。有没有更优雅和更简单的方法来完成这项任务?

4

1 回答 1

1

我建议使用 join 语句。它使您的意图更加清晰。我假设每个客户都有一个 ID,c_id。这意味着我们可以按客户 ID 对交易进行分组。

SELECT c_id, SUM (tSaleAmount - tPaymentAmount) AS totalDebt
FROM Trans
GROUP BY c_id

我们现在有一个包含两列的表,即客户 ID 和客户的总债务。但是,您还希望包含客户信息。此信息包含在带有关联客户 ID 的客户表中。这意味着我们可以在 ID 上连接这两个表。

SELECT Customer.c_id, cName, cSurname, cPbx, cGsm, cLastVisitDate, totalDebt
FROM Customer
JOIN 
   (SELECT c_id, SUM (tSaleAmount - tPaymentAmount) AS totalDebt
    FROM Trans
    GROUP BY c_id) Trans
ON Customer.c_id = Trans.c_id
WHERE totalDebt > 0 AND cLastVisitDate < ?

我们将 SELECT 语句返回的表命名为 Trans 语句。我们还添加了 WHERE 子句,因为我们只想返回有债务并且自给定日期以来未访问过的客户。

于 2013-06-28T20:55:42.210 回答