Truy vấn CSDL?

Liên hệ QC
Đã làm xong:
Có 9 trường hợp 1 NV làm 1 ngày 2 ca:

|
A​
|
B​
|
C​
|
D​
|
E​
|
1​
|
Ngay​
|
Ca​
|
MA_NV​
|
Ma_SF​
|
SLG​
|
2​
|
01/11/2008​
|
3​
| |
4.318​
|
11101​
|
3​
|
30/11/2008​
|
3​
|V1241|
765​
|
1591​
|
4​
|
13/12/2008​
|
3​
|V1262|
123​
|
2201​
|
5​
|
18/08/2008​
|
3​
|V1718|
4.533​
|
1300​
|
6​
|
11/07/2008​
|
2​
|V1721|
4.711​
|
9869​
|
7​
|
10/08/2008​
|
3​
|V1890|
522​
|
9199​
|
8​
|
08/09/2008​
|
3​
|V1897|
4.311​
|
4403​
|
9​
|
21/10/2008​
|
3​
|V1939|
439​
|
7922​
|
10​
|
07/11/2008​
|
3​
|V1962|
852​
|
6340​
|

Kết quả là mỗi NV trong DS trên sẽ tăng số ca lên 1, số TB giảm xuống.

Làm lại ra kết quả như file đính kèm, có kèm kết quả lần trước để so sánh.

Nói thêm: Query làm bằng Access, import vào Excel.

Nếu query bằng access thì dùng luôn ADO trong VBA trong Excel cho khỏe bác ơi!
 
Do câu lệnh SQL tôi không rành nên làm trong Access, trong Access tạo query chỉ việc kéo thả, chỉnh sửa chút đỉnh. Ngoài ra trong Access có thể tạo Query trung gian, mà nếu không sử dụng query trung gian đòi hỏi kiến thức về SQL vững để viết cấu trúc Select lồng nhau, cái này tôi không làm nổi. Trong file tôi sử dụng đến 2 queries trung gian, cái thứ 3 mới là kết quả.
Tuy nhiên Excel của tôi cũng link đến query của Access, nên cũng có thể tự cập nhật.

Vậy Learn Excel làm nốt nhé.

À, mà đã đạt yêu cầu chưa vậy?
 
Lần chỉnh sửa cuối:
Cần câu cũng đã có!

Learn Excel xem 3 cái query trong access, xem dưới dạng SQL view là thấy mà. Cần câu nằm hết trong đó. Để giải thích sơ nhé:

- groupby MaNV và ngày, count(ca), được query thứ nhất, đếm tổng số ca theo ngày (đếm tất cả record, không phân biệt trong 1 ca SX bao nhiêu loại SP, nghĩa là còn bị trùng)

- dùng query thứ nhất, count(ca) lần nữa được query thứ 2, lần này chỉ group theo MaNV, sẽ được số ca thực, loại bỏ những trường hợp 1 ca SX nhiều SP

- dùng query thứ 2, join với bảng table dulieu, lấy trung bình average(số lượng). Đây là query kết quả.

Còn vấn đề 1 ngày làm 2 ca, thì là 1 sự ăn gian: trong query thứ nhất, nếu chỉ groupby ngày thì 1 ngày 1 Công nhân làm 2 ca sẽ bị đếm chung. Muốn đếm riêng thì ăn gian groupby [Ngay] & [Ca] sẽ tách được, thí dụ 01/11/20082 và 01/11/20083

SQL riêng lẻ của từng cái đây:

Mã:
SELECT DULIEU.MA_NV, [Ngay] & [Ca] AS test, Count(DULIEU.Ca) AS NumCa
FROM DULIEU
GROUP BY DULIEU.MA_NV, [Ngay] & [Ca];

Mã:
SELECT Countof_Ca.MA_NV AS MaNV, Count(Countof_Ca.NumCa) AS CaNum
FROM Countof_Ca
GROUP BY Countof_Ca.MA_NV;

Mã:
SELECT CountCa.MaNV, Sum(DULIEU.SLG) AS SumOfSLG, CountCa.CaNum, Sum([Slg])/[CaNum] AS Avrg
FROM DULIEU INNER JOIN CountCa ON DULIEU.MA_NV = CountCa.MaNV
GROUP BY CountCa.MaNV, CountCa.CaNum;

Còn ADO của Excel, viết 3 cái select lồng nhau, tôi cũng chỉ nằm mơ!
 
Lần chỉnh sửa cuối:
Hình như mình nên đơn giản hoá vấn đề đi thì sẽ thấy rõ ràng sáng sủa hơn thì phải, em dùng Pivot mà vẫn thấy ổn! Mong các bác chỉ giáo thêm.
 

File đính kèm

Learn Excel xem 3 cái query trong access, xem dưới dạng SQL view là thấy mà. Cần câu nằm hết trong đó. Để giải thích sơ nhé:

- groupby MaNV và ngày, count(ca), được query thứ nhất, đếm tổng số ca theo ngày (đếm tất cả record, không phân biệt trong 1 ca SX bao nhiêu loại SP, nghĩa là còn bị trùng)

- dùng query thứ nhất, count(ca) lần nữa được query thứ 2, lần này chỉ group theo MaNV, sẽ được số ca thực, loại bỏ những trường hợp 1 ca SX nhiều SP

- dùng query thứ 2, join với bảng table dulieu, lấy trung bình average(số lượng). Đây là query kết quả.

Còn vấn đề 1 ngày làm 2 ca, thì là 1 sự ăn gian: trong query thứ nhất, nếu chỉ groupby ngày thì 1 ngày 1 Công nhân làm 2 ca sẽ bị đếm chung. Muốn đếm riêng thì ăn gian groupby [Ngay] & [Ca] sẽ tách được, thí dụ 01/11/20082 và 01/11/20083

SQL riêng lẻ của từng cái đây:

Mã:
SELECT DULIEU.MA_NV, [Ngay] & [Ca] AS test, Count(DULIEU.Ca) AS NumCa
FROM DULIEU
GROUP BY DULIEU.MA_NV, [Ngay] & [Ca];

Mã:
SELECT Countof_Ca.MA_NV AS MaNV, Count(Countof_Ca.NumCa) AS CaNum
FROM Countof_Ca
GROUP BY Countof_Ca.MA_NV;

Mã:
SELECT CountCa.MaNV, Sum(DULIEU.SLG) AS SumOfSLG, CountCa.CaNum, Sum([Slg])/[CaNum] AS Avrg
FROM DULIEU INNER JOIN CountCa ON DULIEU.MA_NV = CountCa.MaNV
GROUP BY CountCa.MaNV, CountCa.CaNum;

Còn ADO của Excel, viết 3 cái select lồng nhau, tôi cũng chỉ nằm mơ!

@bác pmt0412 (bác Valentine ngược) bác trình bày các bảng phụ, inner join,... rất tường minh SQL view của query tôi cũng đã xem, nhưng thú thực tôi vẫn "kết" một câu lệnh SQL. Tôi sẽ cố gắng kết hợp code của bác và code của anh TuanVNUI xem sao.
 
Nếu như dữ liệu được SORT theo 3 cột Ma_NV-Ngay-Ca thì có thể dùng SUMPRODUCT để tính. Bạn kiểm tra xem kết quả có đúng không? (có điều SUMPRODUCT tính chậm quá).
 

File đính kèm

Có thể giảm thời gian nếu tính cột F = SumIf() thay vì SumProduct().
Nhưng vẫn chậm!
 
Có thể giảm thời gian nếu tính cột F = SumIf() thay vì SumProduct().
Nhưng vẫn chậm!

Nếu dùng excel :

Vì sẽ lấy ngày tháng trong một khoảng + Một mã NV xuất hiện rất ít lần --> Nên Sort trước cột Ngày tháng và Dùng UDF với phương thức Find thì sẽ nhanh hơn rất nhiều lần (sẽ không ngờ đó)

Thân!
 
Web KT

Bài viết mới nhất

Back
Top Bottom