2013-02-26 53 views
1

我已选择完美的作品。基于选择SQL服务器的更新声明

update ClientS set StatusID=4 
where ClientID= (select P.ClientID 
    ,LastName+' '+FirstName as Name 
    ,Address 
    ,max(p.PickupDate)as 'Last Pickup' 
    ,DATEDIFF(month,max(p.PickupDate),GETDATE())as'last pickup was months ago' 
from Pickup P 
join Clients C on P.ClientID= C.ClientID 
where WIC=0 and C.StatusID = 1 or WIC=0 and C.StatusID = 2 
group by p.clientid, lastname + ' ' + firstname,address 
order by 4) 

我需要基于此选择中的一个last pickup was months ago的更新声明。我需要在Clients表中更新客户端StatusID,并将其设置为4,仅限于此选择中最后一次取件超过2个月前的客户端。 到目前为止,我有这个

create procedure pr_UpdateStatusHwoPickupMoreThanTwoM 
AS 
update ClientS set StatusID=4 
where ClientID= (select P.ClientID 
    ,LastName+' '+FirstName as Name 
    ,Address 
    ,max(p.PickupDate)as 'Last Pickup' 
    ,DATEDIFF(month,max(p.PickupDate),GETDATE())as'last pickup was months ago' 
from Pickup P 
join Clients C on P.ClientID= C.ClientID 
where WIC=0 and C.StatusID = 1 or WIC=0 and C.StatusID = 2 
group by p.clientid, lastname + ' ' + firstname,address 
order by 4) 

我知道这是不对的,我需要以某种方式指定最后一个拍摄了2个多月前,但不能想通了如何和更改StatusID只为那些ClientID。任何想法如何做到这一点?

回答

1

试试这个

update C 
set StatusID=4 
from (SELECT P.ClientID, MAX(p.PickupDate) MaxPickupDate 
     FROM @Pickup P 
     group by P.Clientid) P 
    join @Clients C on P.ClientID= C.ClientID 
where C.WIC=0 and C.StatusID in (1, 2) 
     AND P.MaxPickupDate<DATEADD(month,-2,GETDATE()) 

此外,你必须在这里

where WIC=0 and C.StatusID = 1 or WIC=0 and C.StatusID = 2 

错误这种情况下将真正与WIC = 0的任何行,你可以纠正这种方式

WHERE WIC=0 AND C.StatusID in (1,2) 
+0

不像组15615,级别15,状态1,行6 关键字'组'附近的语法不正确。 – Andrey 2013-02-26 03:51:17

+0

@AndreyIvanov我更新了答案。忘记'UPDATE FROM'不允许'GROUP BY'。 – 2013-02-26 04:14:18

+0

它将所有客户端设置为不活动状态ID 4,好,我在测试表上做了不在真正的表格中的数据库:) – Andrey 2013-02-26 04:28:37

1

尝试此查询

对于SQL Server

update ClientS set StatusID=4 
where ClientID= (select P.ClientID 
from Pickup P 
join Clients C on P.ClientID= C.ClientID 
where WIC=0 and C.StatusID = 1 or WIC=0 and C.StatusID = 2 
group by p.clientid 
having max(p.PickupDate) < DATEADD(month,-2,GETDATE())); 

你内心的查询返回多列1行,你与只iswhy你没有得到预期的效果比较的clientId。

+0

引发错误消息4145,级别15,状态1,行7 在上下文中指定的非布尔类型的表达式,其中条件n预计接近')'。 – Andrey 2013-02-26 03:47:56

+0

你正在使用哪个版本的sqlserver? – Meherzad 2013-02-26 03:49:04

+0

它是sql express r2 2008 SP2 – Andrey 2013-02-26 03:52:15