Tôi muốn viết một truy vấn SQL để tìm số ngày làm việc duy nhất cho mỗi nhân viên từ bảng 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' |
*---------------------------------------*
Sản lượng dự kiến:
*-------------------*
|emp_id no_of_days |
*-------------------*
| 1 4 |
| 2 5 |
*-------------------*
Tôi đã viết truy vấn sqlfiddle đang cho tôi expected
đầu ra nhưng vì tò mò có cách nào tốt hơn để viết truy vấn này không? Tôi có thể sử dụng bảng Calender hoặc Tally không?
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
Bất kỳ đề xuất nào cũng sẽ rất tuyệt.
(1, 1, 'monday', 'wednesday'),(1, 2, 'monday', 'tuesday'),(1, 3, 'friday', 'friday');
1 2 'monday' 'tuesday'
thành 1 2 'monday' 'wednesday'
kết quả vẫn là 4 ngày nhưng nó sẽ trả về 5
(1, 1, 'monday', 'wednesday'),(1, 2, 'monday', 'tuesday'),(1, 3, 'monday', 'tuesday');
empid_1 đã hoạt động được 3 ngày (thứ hai, thứ ba, thứ tư), fiddle / truy vấn trả về 4