ฉันต้องการที่จะเขียนแบบสอบถาม 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 |
*-------------------*
ฉันได้เขียนsqlfiddleแบบสอบถามซึ่งให้expected
ผลลัพธ์กับฉันแต่สำหรับความอยากรู้มีวิธีที่ดีกว่าในการเขียนแบบสอบถามนี้หรือไม่ ฉันสามารถใช้ตารางปฏิทินหรือ Tally ได้หรือไม่
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