Microsoft Access - 生成特定查询

时间:2012-09-30 19:56:39

标签: sql ms-access

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

这是两个表:

客户表

  

customerId,name

交易表

  

transactionId,customerId,amountPaid,purchaseDate

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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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#

答案 2 :(得分: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;