मैं प्रत्येक कर्मचारी के लिए तालिका से अद्वितीय कार्य दिवसों की संख्या खोजने के लिए एक SQL क्वेरी लिखना चाहता हूं times।
*---------------------------------------*
|emp_id task_id start_day end_day |
*---------------------------------------*
| 1 1 'monday' 'wednesday' |
| 1 2 'monday' 'tuesday' |
| 1 3 'friday' 'friday' |
| 2 1 'monday' 'friday' |
| 2 1 'tuesday' 'wednesday' |
*---------------------------------------*
अपेक्षित उत्पादन:
*-------------------*
|emp_id no_of_days |
*-------------------*
| 1 4 |
| 2 5 |
*-------------------*
मैंने क्वेरी sqlfield लिखा है जो मुझे expectedआउटपुट दे रहा है लेकिन जिज्ञासा के लिए इस क्वेरी को लिखने का एक बेहतर तरीका है? क्या मैं कैलेंडर या टैली टेबल का उपयोग कर सकता हूं?
with days_num as
(
select
*,
case
when start_day = 'monday' then 1
when start_day = 'tuesday' then 2
when start_day = 'wednesday' then 3
when start_day = 'thursday' then 4
when start_day = 'friday' then 5
end as start_day_num,
case
when end_day = 'monday' then 1
when end_day = 'tuesday' then 2
when end_day = 'wednesday' then 3
when end_day = 'thursday' then 4
when end_day = 'friday' then 5
end as end_day_num
from times
),
day_diff as
(
select
emp_id,
case
when
(end_day_num - start_day_num) = 0
then
1
else
(end_day_num - start_day_num)
end as total_diff
from days_num
)
select emp_id,
sum(total_diff) as uniq_working_days
from day_diff
group by
emp_id
कोई भी सुझाव बढ़िया होंगे।
(1, 1, 'monday', 'wednesday'),(1, 2, 'monday', 'tuesday'),(1, 3, 'friday', 'friday');
1 2 'monday' 'tuesday'करने के लिए 1 2 'monday' 'wednesday'परिणाम अभी भी 4 दिन होना चाहिए, लेकिन यह 5 रिटर्न
(1, 1, 'monday', 'wednesday'),(1, 2, 'monday', 'tuesday'),(1, 3, 'monday', 'tuesday');empid_1 ने 3 अलग-अलग दिन (सोमवार, मंगलवार, बुधवार) काम किया है, फिडल / क्वेरी रिटर्न 4