У меня есть две таблицы:
create table CurrentDay (
ID int identity primary key,
ssn varchar(10),
val money,
CheckDate datetime,
CurrentStatus tinyint)
create table PreviousDay (
ID int identity primary key,
ssn varchar(10),
val money,
CheckDate datetime,
CurrentStatus tinyint)
Мне нужно обновить поле CurrentDay.CurrentStatus со следующими значениями:
- 111, если в PreviousDay.ssn тот же ssn, что и в CurrentDay, и если значение PreviousDay такое же, как и в CurrentDay;
- 112, если в PreviousDay.ssn такое же, как в CurrentDay, и если значение PreviousDay больше, чем в CurrentDay;
- 113, если в PreviousDay.ssn такое же, как в CurrentDay, и если значение PreviousDay меньше, чем в CurrentDay;
- 114,если в нем нет PreviousDay.ssn такой же как и в CurrentDay т.е. ssn только в CurrentDay (это сегодняшняя информация) .
Я бы написал какой-то запрос, но желательно найти другой способ выполнения этой задачи, используя только одно соединение между таблицами PreviousDay и CurrentDay. Очевидно, что это не очень удачный вид... Вот мой вариант:
Update CurrentDay
Set CurrentStatus=case
when exists (select PreviousDay.ID from PreviousDay
where PreviousDay.ssn=CurrentDay.ssn AND
PreviousDay.val=CurrentDay.val AND
PreviousDay.CheckDate=DATEADD(day,-1,CurrentDay.CheckDate))
then 111
when exists (select PreviousDay.ID from PreviousDay
where PreviousDay.ssn=CurrentDay.ssn AND
PreviousDay.val>CurrentDay.val AND
PreviousDay.CheckDate=DATEADD(day,-1,CurrentDay.CheckDate))
then 112
when exists (select PreviousDay.ID from PreviousDay
where PreviousDay.ssn=CurrentDay.ssn AND
PreviousDay.val<CurrentDay.val AND
PreviousDay.CheckDate=DATEADD(day,-1,CurrentDay.CheckDate))
then 113
when exists (select PreviousDay.ID from PreviousDay
where PreviousDay.ssn!=CurrentDay.ssn AND
PreviousDay.CheckDate=DATEADD(day,-1,CurrentDay.CheckDate))
then 114
end;
Вот другой запрос, но в этом случае я не могу обновить fieid CurrentDay.CurrentStatus со значением 114, потому что в обеих таблицах есть только совпадающие строки на ssn:
Set Currentday.CurrentStatus=(select 111 where PreviousDay.val=CurrentDay.val union all select 112 where and PreviousDay.val>CurrentDay.val
union all select 113 where and PreviousDay.val<CurrentDay.val /*union all select 114 */ )
from PreviousDay join CurrentDay on PreviousDay.ssn=CurrentDay.ssn and PreviousDay.CheckDate=DATEADD(day,-1,CurrentDay.CheckDate)
У тебя есть другие идеи?