2013-09-25 4 views
0

В моем решении используется оператор case, который работает не так, как ожидалось. Может кто-нибудь исправить это?Использование выражения case в SQL Server

У меня есть ниже приведённой таблицы

create table data_cte 
(
weekdate datetime, 
activity varchar(10), 
starttime varchar(5), 
endtime varchar(5), 
duration numeric(6,2), 
ishomeoroffice varchar(1), 
ispaidgap varchar(1), 
isScheduled varchar(1) 
) 

данных в нем будет ниже.

  weekdate   || activity || starttime  || endtime   || duration || ishomeoroff || ispaidgap || isscheduled 
    2013-09-09 00:00:00.000 || W-100001 || 08:00   || 11:00   || 3   || H   || N   || Y 
    2013-09-09 00:00:00.000 ||  GAP || 11:00   || 12:00   || 1   || G   || Y   || Y 
    2013-09-09 00:00:00.000 || T-100002 || 12:00   || 13:00   || 1   || H   || N   || NULL 
    2013-09-09 00:00:00.000 || W-100001 || 13:00   || 15:00   || 2   || O   || N   || NULL 
    2013-09-09 00:00:00.000 || W-100001 || 15:00   || 18:00   || 3   || O   || N   || NULL 
    2013-09-09 00:00:00.000 || T-100002 || 18:00   || 18:45   || 0.75  || O   || N   || NULL 
    2013-09-09 00:00:00.000 ||  GAP || 18:45   || 19:15   || 0.5   || G   || N   || NULL 
    2013-09-09 00:00:00.000 || W-100001 || 19:15   || 22:15   || 3   || H   || N   || N 
    2013-09-10 00:00:00.000 || W-100001 || 8:15   || 11:15   || 3   || H   || N   || Y 
    2013-09-10 00:00:00.000 ||  GAP || 11:15   || 12:15   || 1   || G   || Y   || Y 
    2013-09-10 00:00:00.000 || T-100002 || 12:15   || 13:15   || 1   || H   || N   || NULL 
    2013-09-10 00:00:00.000 || W-100001 || 13:15   || 18:00   || 4.75  || O   || N   || NULL 
    2013-09-10 00:00:00.000 || T-100002 || 18:00   || 18:45   || 0.75  || O   || N   || NULL 
    2013-09-10 00:00:00.000 ||  GAP || 18:45   || 19:30   || 0.75  || G   || Y   || NULL 
    2013-09-10 00:00:00.000 || W-100001 || 19:30   || 21:30   || 2   || H   || N   || Y 

Мне нужна еще одна колонка, чтобы отметить путешествие, которое должно быть оплачено как «Y». Ниже приведены условия его маркировки.

  1. Если поездки после оплаченного разрыв, он должен быть отмечен как «Y»
  2. Если поездка до уплаты разрыва, он должен быть помечен как «Y»

  3. Если путешествие после запланированных работ. т.е. одно рабочее (запланированное) действие, а затем платная (далее), а затем перемещаемая деятельность, то движение должно быть отмечено как «Y»

  4. Если поездка до любой запланированной работы, то есть перемещение, то платная (Y/N) затем попланировать, что «Путешествия» следует обозначить как «Y»

Проще говоря, если путешествие происходит с определенной целью, то есть для любой запланированной работы, тогда движение должно быть отмечено «Y», else 'N'.

Я пробовал ниже один. Но его маркировка «Y» для путешествия (9-й sep, 18: 45-19: 15), которая на самом деле неверна, поскольку цель поездки не была запланирована (означает, что последующая работа не была запланирована)

select weekdate,activity,starttime,endtime,duration,ishomeoroffice,ispaidgap, 
(case when activity='T-100002' then 
(case 
when exists(select 1 from data_cte cd1 where T3.weekdate=cd1.weekdate and T3.endtime=cd1.starttime and cd1.activity='GAP' and cd1.ispaidgap='Y') then 'Y' 
when exists(select 1 from data_cte cd2 where T3.weekdate=cd2.weekdate and T3.endtime=cd2.starttime and cd2.activity='W-100001'and cd2.isscheduled='Y') then 'Y' 
when exists(select 1 from data_cte cd3 where T3.weekdate=cd3.weekdate and T3.starttime=cd3.endtime and cd3.activity='GAP' and cd3.ispaidgap='Y')then 'Y' 
when exists(select 1 from data_cte cd4 where T3.weekdate=cd4.weekdate and T3.starttime=cd4.endtime and cd4.activity='W-100001'and cd4.isscheduled='Y') then 'Y' 

else 'N' end) 
end) 
isTravel, 
isScheduled from data_cte T3 ORDER BY weekdate,starttime 

Может ли кто-нибудь предложить мне способ решить эту проблему?

Заранее спасибо

+0

Я только что видел ваш запрос с футляром .. Я думаю, вы можете изменить это, объединив эти множественные условия 'выберите 1 из data_cte cd1, где T3.endtime = cd1.starttime и cd1.activity =' GAP 'и cd1.ispaidgap = 'Y'' 'выберите 1 из data_cte cd2, где T3.endtime = cd2.starttime и cd2.activity =' W-100001 'и cd2.isscheduled =' Y'' , когда существует (выберите 1 из data_cte cd3, где T3.starttime = cd3.endtime и cd3.activity = 'GAP' an d cd3.ispaidgap = 'Y'), тогда 'Y' , когда существует (выберите 1 из data_cte cd4, где T3.starttime = cd4.endtime и cd4.activity = 'W-100001' и cd4.isscheduled = 'Y' –

+0

@ pratikgarg: Я попытался связать эти 4 условия в 2. Это был тот же результат, с которым я закончил. –

+0

только что получил это наблюдение .. это не решение. , для лучшей производительности и понимания вы можете изменить свой запрос, объединив эти четыре условия. выберите 1 из data_cte cd1 где (T3.endtime = cd1.starttime и cd1.activity = 'GAP' и cd1.ispaidgap = 'Y ') или (T3.endtime = cd2.starttime и cd2.activity = 'W-100001' и cd2.isscheduled = 'Y') ....... –

ответ

0

Я думаю .. Вы должны иметь условие на weekdate столбцов также в операторах случае.

чек в вашем столе должны быть где-то, по крайней мере один ряд с activity значение либо «GAP» или «W-100001» с ispaidgap = «Y» наряду с любым starttime как '19: 15' или endtime = '18 : 44 '

+0

Я буду налагать условие на выходные. Но, в текущем сценарии, и пробел, и работа лежат на той же неделе. –

+0

Привет, Есть один сценарий, где мне может понадобиться ваша помощь. Если запланированная работа после неоплаченного разрыва, она должна означать istravel как «Y» ... Но в этом случае это не делает то, что я ожидаю. –

+0

Я смутился .. не могли бы вы привести пример и для этого .. –

Смежные вопросы