私のソリューションで使用されている case ステートメントが、期待どおりに機能していません。誰でも修正できますか?
以下の表があります
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」とマークする必要があります。
旅行が有給ギャップの前にある場合は、「Y」とマークする必要があります
旅行が予定された仕事の後の場合。つまり、1 つの作業 (スケジュールされた) アクティビティ、次に有給ギャップ (Y/N)、次に旅行アクティビティ、その旅行は「Y」とマークする必要があります。
- 出張がスケジュールされた作業の前にある場合、つまり、出張、ペイドギャップ (Y/N)、勤務 (予定) の場合、その出張は「Y」とマークする必要があります。
簡単に言うと、移動が目的のために行われる場合、つまりスケジュールされた仕事のために移動する場合は、移動に「Y」または「N」のマークを付ける必要があります。
私は以下のものを試しました。しかし、Travel(9th 9 18:45-19:15) の 'Y' マークは実際には間違っています。これは、旅行の目的がスケジュールされていないためです (つまり、次の作業がスケジュールされていないことを意味します)。
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
誰でもこれを解決する方法を提案してもらえますか?
前もって感謝します