更新每个客户的所有服务的查询,但最近的除外

时间:2012-06-04 02:02:39

标签: sql ms-access sql-update

总体而言,我要做的只是显示过去30天内 的最新客户记录&仅根据当前日期显示最新的服务记录。

有两张桌子和一张桌子。它们以一对多的关系构建。

第一个表是表:“customer”

|---------------------------------------------------|
| ID | FirstName | LastName | Male | Female | Phone | 
|---------------------------------------------------|
  35    John       Mulling    True    False    905    
  84    Mike       Stone      True    False    416    
  90    Cassie     Daniels    False   True     315    

第二个表是表:“tblservice”

|-------------------------------------------------------------------------|
| ServiceID  |  Followup30 | Timing     | Service1 | Total   | customerID |
|-------------------------------------------------------------------------|
      1         Yes         01/02/2012   Serv-001   120.00       35
      2         No          02/05/2012   Serv-003   500.00       84
      3         No          03/25/2012   Serv-008    85.00       90

此列表在用户界面中通过以下查询进行过滤,该查询每周一次或每月一次由员工检查以跟进客户(一旦打电话给客户,员工设置'followup30'复选框'是'):

SELECT customer.FirstName, customer.LastName, customer.Male, customer.Female,
customer.Phone, tblservice.Followup30, tblservice.Timing, tblservice.Service1,
tblservice.Total 
FROM customer 
INNER JOIN tblservice 
ON customer.ID=tblservice.customerID 
WHERE (((tblservice.Followup30)=No) 
AND ((tblservice.Timing)<=DateAdd("d",-30,Date())) 
AND ((customer.Phone) Is Not Null)) 
ORDER BY tblservice.Timing; 

然而,问题似乎是当客户在20天内说出来时,他/她之前的条目仍然在需要跟进的系统中。 (我想要显示这个旧的服务记录只有最新的&amp;如果它超过30天)

UI中的上述查询将处理30天或更早的部分,但是我需要清理列表中旧客户服务条目的系统。

尝试:

所以我想在加载用户界面时执行更新查询,这将清除员工的所有旧服务条目的列表。

我只是希望查询将每个客户的服务表中的真/假字段(followup30)的所有条目设置为真正之外的最近日期。

这是我到目前为止所做的,但我认为它不会分别对待每个客户,并且可能存在一些语法问题。

UPDATE tblservice
SET followup30='Yes'
WHERE (SELECT Timing FROM tblservice WHERE Timing <> (SELECT MAX(Timing) 
FROM tblservice));

非常感谢任何帮助,谢谢

2 个答案:

答案 0 :(得分:0)

您可以使用相关子查询执行此操作:

UPDATE tblservice
    SET followup30 = 'Yes'
    FROM (select max(Timing) as maxTiming
          from tblservice ts
          where tblservice.CustomerId = ts.Customerid
         ) t
    where tblservice.Timing = maxTiming

我认为这会抓住你想要的逻辑,只关注最新的记录。 (您可能需要修改它以放入30天的逻辑。)

答案 1 :(得分:0)

我确信您可以使用嵌入式SQL执行此操作,但是如果您创建一个名为LastService的查询,如下所示

SELECT tblService.CustomerId, Max(tblService.Timeing) AS MaxOfTimeing FROM tblService GROUP BY tblService.CustomerId;

然后您可以在更新查询中使用它,如下所示

UPDATE customer INNER JOIN LastService ON customer.CustomerId = LastService.CustomerId SET customer.Followup30 = iif(LastService.MaxOfTimeing<DateAdd("d",-30,Now()),'YES','NO')

假设Followup30是一个文本字段,如果是YES / NO字段,则必须相应地调整更新查询。