0

这是我面临的一个有趣的挑战。如果你可以为这个问题创建一个查询,我称你为天才——这让我困扰了很长一段时间。

这里有两张表:

客户表

客户 ID、姓名

交易表

transactionId、customerId、amountPaid、purchaseDate

我想为当月没有任何交易但前几个月欠款的人选择所有 customerId。

例如,如果我选择的月份是 10 月,我想选择 10 月份没有交易但 10 月之前的交易总和大于零的所有 customerId。基本上,我的目标是生成一份报告,显示当月没有欠款但前几个月欠款的客户的收据。感谢您考虑这个问题。

4

3 回答 3

0

您可能需要重新考虑您的数据库模型。恕我直言,我认为您需要更多表格来处理多个月。假设以月份(1 月到 12 月)作为列和 userid 列的表。从那我认为你应该能够执行你所描述的算法。

于 2012-09-30T20:05:23.163 回答
0

您可以获取每个客户在所选月份之前的购买日期(包括所选月份),并检查该日期是否在所选月份之前。

自从我使用 Access 以来已经有一段时间了,但是是这样的:

select c.customerId, c.name, max(t.purchaseDate) as lastPurchaseDate
from Customers as c
inner join Transactions as t on t.customerId = c.CustomerId and t.PurchaseDate < #2012-11-01#
group by c.customerId, c.name
having lastPurchaseDate < #2012-10-01#
于 2012-09-30T20:06:20.783 回答
0

我终于在 user1238850 和 Guffa 的帮助下解决了这个问题。这有点混乱,但到目前为止它似乎工作。

SELECT Customers.customerId 
FROM (
    SELECT Customers.customerId
    FROM  Customers
    WHERE (((Customers.customerId) Not In (
        SELECT Transactions.customerId 
        FROM Transactions 
        WHERE Customers.customerId = Transactions.customerId AND 
              Transactions.purchaseDate >=#8/1/2012# AND 
              Transactions.purchaseDate <#9/1/2012# OR 
              Transactions.customerId Is Null)))
      )

AS Q1     
INNER JOIN (     
    SELECT Transactions.customerId, Sum(Transactions.amountPaid) AS SumOfamountPaid
    FROM Transactions
    WHERE Transactions.purchaseDate <#8/1/2012#
    GROUP BY Transactions.customerId 
           ) AS Q2 
        ON Q1.customerId = Q2.customerId;
于 2012-10-04T13:34:40.927 回答