Saya ingin menulis kueri SQL untuk menemukan jumlah hari kerja yang unik untuk setiap karyawan dari tabel 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' |
*---------------------------------------*
Output yang diharapkan:
*-------------------*
|emp_id no_of_days |
*-------------------*
| 1 4 |
| 2 5 |
*-------------------*
Saya telah menulis kueri sqlfiddle yang memberikan saya expected
output tetapi untuk rasa ingin tahu apakah ada cara yang lebih baik untuk menulis kueri ini? Bisakah saya menggunakan tabel Calender atau 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
Setiap saran akan sangat bagus.
sql
sql-server
tekun
sumber
sumber
(1, 1, 'monday', 'wednesday'),(1, 2, 'monday', 'tuesday'),(1, 3, 'monday', 'tuesday');
empid_1 telah bekerja 3 hari yang berbeda (Senin, Selasa, Rabu), biola / kueri mengembalikan 4(1, 1, 'monday', 'wednesday'),(1, 2, 'monday', 'tuesday'),(1, 3, 'friday', 'friday');
1 2 'monday' 'tuesday'
ke1 2 'monday' 'wednesday'
hasilnya tetap harus 4 hari tapi kembali 5Jawaban:
Anda pada dasarnya perlu menemukan persimpangan hari yang digunakan oleh masing-masing
emp_id
pada setiap haritask
dengan semua hari dalam seminggu, dan kemudian menghitung hari yang berbeda:Keluaran:
Demo di SQLFiddle
sumber
join
denganbetween
karena kondisinya mencapai hasil yang sama lebih mudah ...Salah satu pendekatan yang mungkin untuk menyederhanakan pernyataan dalam pertanyaan (biola), adalah dengan menggunakan
VALUES
konstruktor nilai tabel dan gabungan yang sesuai:Tetapi jika Anda ingin menghitung hari yang berbeda , pernyataannya berbeda. Anda perlu mencari semua hari antara
start_day
danend_day
jangkauan dan menghitung hari yang berbeda:sumber
1 2 'monday' 'tuesday'
ke1 2 'monday' 'wednesday'
hasilnya tetap harus 4 hari tapi kembali 5.monday
danwednesday
. Apakah saya melewatkan sesuatu?5
, tidak4
. Jawaban ini hanya menyarankan pernyataan yang lebih sederhana. Terima kasih.Permintaan Anda tidak benar. Coba Senin hingga Selasa dengan Rabu hingga Kamis. Ini akan menghasilkan dalam 4 hari, tetapi permintaan Anda kembali 2 hari. Permintaan Anda bahkan tidak mendeteksi apakah dua rentang berdekatan atau tumpang tindih atau tidak.
Salah satu cara untuk mengatasi ini adalah dengan menulis CTE rekursif untuk mendapatkan semua hari dari rentang dan kemudian menghitung hari yang berbeda.
Demo: http://sqlfiddle.com/#!18/4a5ac/16
(Seperti yang bisa dilihat saya tidak bisa menerapkan konstruktor nilai secara langsung seperti pada
with weekdays (day_name, day_number) as (values ('monday', 1), ...)
. Saya tidak tahu mengapa. Apakah itu SQL Server atau saya? Nah, dengan tambahan pilih berfungsi :-)sumber
sumber
sumber