thắc mắc Tối ưu query sql server

kulboy_vn

Senior Member
Hi các thím.
qCjBIWN.gif

Mình đang có bài toán khá khoai cần nhờ ae chỉ giúp.
Đề bài của mình đc giao là thống kế chênh lệch suất ăn của nhân viên từ bảng TBL_DANGKYCOM.
Mình phải groupby MaNhanVien vì bảng này là tất cả các nhân viên đăng ký ăn sẽ lưu ở bảng này, sau khi mình có đc 1 list nhân viên đăng ký cơm từ bảng TBL_DANGKYCOM thì mình phải hiển thị tiếp các nhân viên trong list nhân viên đã lấy gọi là listE đi
thì bây giờ mình lại viết 1 câu query để Count tổng số lần nv thứ n đăng ký và tiếp theo là đếm số lần đăng ký các suất cơm(35,40,45k) như trong ảnh dưới. Vấn đề như này thì web load chậm quá.
Mình chưa nghĩ ra đc các nào khác. Mong các thím cao nhân chỉ giáo thêm ạ.
gyTP1DP.gif

Cảm ơn tất các thím ạ. À em không dùng stored procedure.
fJQnixL.gif

Annotation 2020-06-11 145849.png
 

gâu_

Đã tốn tiền
mình đọc post 1 không hiểu bài toán là gì nên không thể giải được, chờ ai đọc hiểu được giải thích :(
 

kulboy_vn

Senior Member
mình đọc post 1 không hiểu bài toán là gì nên không thể giải được, chờ ai đọc hiểu được giải thích :(
văn của em nó ngu quá thật :(

sorry thím.
Đại loại là bài toán họ bắt em thống kê chênh lệch suất ăn của nhân viên.
Chênh lệch tổng số đăng ký cơm và số thực tế họ có đi ăn không. như trong ảnh của em đó thím.
Thì giờ em phải groupby với cột MANHANVIEN ra đc cái list nhân viên đăng ký
rồi em FOR list đó rồi lại query tiếp để count tổng số lầnđăng ký (suất 35,40,45k như trên ảnh)
rồi em lại count tiếp với query ( where CHECKDAAN=TRUE).COUNT(). để thống kê số lượt thực tế họ đi ăn.
Như vậy thì chậm quá mà em chưa nghĩ ra cách nào khác để tối ưu query ạ
X5DLckw.gif
 

honeyfox

Đã tốn tiền
Mình đọc cũng ko hiểu yêu cầu, cơ mà có thắc mắc là cái cách đặt prefix TBL_ từ đâu ra mà nhiều code do VN phát triển xài cái prefix này. Ngoài table ra thì còn thứ gì khác nữa hay sao mà phải prefix TBL :confused:
 

kulboy_vn

Senior Member
Mình đọc cũng ko hiểu yêu cầu, cơ mà có thắc mắc là cái cách đặt prefix TBL_ từ đâu ra mà nhiều code do VN phát triển xài cái prefix này. Ngoài table ra thì còn thứ gì khác nữa hay sao mà phải prefix TBL :confused:
Đọc DB của mấy ông dev cũ em mất cả tuần mới hiểu đc tên cột các thím ạ
Wk0ydPR.gif
 

honeyfox

Đã tốn tiền
Một row cần 6 lần COUNT() thì mình ko nghĩ là có thể tối ưu bằng 1 query đâu.
 

TTyPT

Senior Member
Lồng 3 câu query cơ à, mà đi hỏi sql trong khi đưa mỗi cái bảng kq mong muốn mà không đưa tke dữ liệu thì ai tư vấn cho nổi :beat_shot:
 

doraku

Junior Member
văn của em nó ngu quá thật :(

sorry thím.
Đại loại là bài toán họ bắt em thống kê chênh lệch suất ăn của nhân viên.
Chênh lệch tổng số đăng ký cơm và số thực tế họ có đi ăn không. như trong ảnh của em đó thím.
Thì giờ em phải groupby với cột MANHANVIEN ra đc cái list nhân viên đăng ký
rồi em FOR list đó rồi lại query tiếp để count tổng số lầnđăng ký (suất 35,40,45k như trên ảnh)
rồi em lại count tiếp với query ( where CHECKDAAN=TRUE).COUNT(). để thống kê số lượt thực tế họ đi ăn.
Như vậy thì chậm quá mà em chưa nghĩ ra cách nào khác để tối ưu query ạ
X5DLckw.gif
đọc xong vẫn chưa biết thím muốn gì, có câu query hiện tại ko, coi nó sao rồi, đọc code hiện tai có khi dễ hiểu hơn thím diễn đạt :D
 

honeyfox

Đã tốn tiền
hiểu thì hiểu rồi, cơ mà vẫn giữ quan điểm là không thể tối ưu với 6 lần COUNT() cho 3 suất cơm với các bảng có sẵn.
 

TTyPT

Senior Member
Code:
sum(case when "đăng ký cơm 35k" = true then 1 else 0) dky_com_35k,
sum(case when "đăng ký cơm 40k" = true then 1 else 0) dky_com_40k,
sum(case when "đăng ký cơm 45k" = true then 1 else 0) dky_com_45k,
sum(case when "đăng ký cơm 35k" = true and "đã ăn" = true then 1 else 0) soluong_com_35k,
sum(case when "đăng ký cơm 40k" = true and "đã ăn" = true then 1 else 0) soluong_com_40k,
sum(case when "đăng ký cơm 45k" = true and "đã ăn" = true then 1 else 0) soluong_com_45k
đang nghĩ sẽ làm như này :big_smile:
 

nguyenluc900

Junior Member
Code:
sum(case when "đăng ký cơm 35k" = true then 1 else 0) dky_com_35k,
sum(case when "đăng ký cơm 40k" = true then 1 else 0) dky_com_40k,
sum(case when "đăng ký cơm 45k" = true then 1 else 0) dky_com_45k,
sum(case when "đăng ký cơm 35k" = true and "đã ăn" = true then 1 else 0) soluong_com_35k,
sum(case when "đăng ký cơm 40k" = true and "đã ăn" = true then 1 else 0) soluong_com_40k,
sum(case when "đăng ký cơm 45k" = true and "đã ăn" = true then 1 else 0) soluong_com_45k
đang nghĩ sẽ làm như này :big_smile:
COUNT chứ sao lại SUM
WHEN HINHTHUC = 35 THEN COUNT(*) dk_35k,
WHEN HINHTHUC = 40 THEN COUNT(*) dk_40k,
...
 

kulboy_vn

Senior Member
hiểu thì hiểu rồi, cơ mà vẫn giữ quan điểm là không thể tối ưu với 6 lần COUNT() cho 3 suất cơm với các bảng có sẵn.
Vậy thì làm cách nào khác không ạ? Hiện tại em chưa nghĩ ra cách nào khác ạ:beat_brick:
 

gâu_

Đã tốn tiền
SQL:
SELECT MaNhanVien, Active, HinhThuc, count(ChamComID) as solan
FROM TBL_DANGKYCOM
GROUP BY MaNhanVien, Active, HinhThuc;

như này thì vấn đề gì không chủ thớt, mình test MySQL thì ok, không rõ SQL Server có gì khác không
 

ez-aqua

Member
Cái bạn muốn là làm sao để query ra 1 cái thứ trông như thế này đúng không

Nhân viênĐặt loại 35kĐặt loại 40kĐặt loại 45kThực tế 35kThực tế 40kThực tế 45
XXX1032922

Và làm sao để tối ưu câu query này đúng không

Cho mình hỏi cái cờ đã ăn là ở đâu trong cái bảng này, nó nằm luôn trong bảng này hay bảng khác. Chứ trong hình của bạn là mình thấy trong bảng đăng kí cơm không có cờ nào là cờ đã ăn cả

1591864670381-png.86285
 
Top