0

私のソリューションで使用されている 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 つの列が必要です。以下は、それをマークするための条件です。

  1. 有給ギャップ後の旅行の場合は、「Y」とマークする必要があります。
  2. 旅行が有給ギャップの前にある場合は、「Y」とマークする必要があります

  3. 旅行が予定された仕事の後の場合。つまり、1 つの作業 (スケジュールされた) アクティビティ、次に有給ギャップ (Y/N)、次に旅行アクティビティ、その旅行は「Y」とマークする必要があります。

  4. 出張がスケジュールされた作業の前にある場合、つまり、出張、ペイドギャップ (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

誰でもこれを解決する方法を提案してもらえますか?

前もって感謝します

4

1 に答える 1

0

私は思う..weekdateケースステートメントでも列に条件を付ける必要があります。

activityテーブルをチェックインして、「GAP」または「W-100001」のいずれかの値を持つ行が少なくとも 1 行あり、ispaidgap「Y」 が「 starttime19:15 」または「 endtime18:44 」のいずれかである必要があります。

于 2013-09-25T10:52:18.850 に答える