2013-02-26 96 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