Query, Group By dùng SUM không ra kết quả

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,597
Được thích
16,656
Giới tính
Nam
Tôi tạo một query từ 2 table, cấu trúc SQL như sau:

Mã:
SELECT ToNhom, LenhSanXuat, NgayCap, DonHang, NgayDH, NgayGH, TenKH, MaKH, MAsP, MAsPKhach, MaQuai, MaDe, MaMatTay, MauSac, ChatLieu, HieuIn, NhomSizeQuai, ChiTietQuai, NhomSizeDe, ChiTietDe, TimeRowDH, NgayNhan, Sum(PCSize38) AS PC38, Sum(PCSize39) AS PC39, Sum(PCSize40) AS PC40, Sum(PCSize41) AS PC41, Sum(PCSize42) AS PC42, Sum(PCSize43) AS PC43, Sum(PCSize44) AS PC44, Sum(PCSize45) AS PC45, Sum(PCSize46) AS PC46, Sum(PCTong) AS TongPC, Sum(SXSize38) AS SX38, Sum(SXSize39) AS SX39, Sum(SXSize40) AS SX40, Sum(SXSize41) AS SX41, Sum(SXSize42) AS SX42, Sum(SXSize43) AS SX43, Sum(SXSize44) AS SX44, Sum(SXSize45) AS SX45, Sum(SXSize46) AS SX46, Sum(SXTong) AS TongSX
FROM (SELECT
fldToNhom As ToNhom,
fldLenhSX As LenhSanXuat,
fldNgayCap As NgayCap,
fldDonHang As DonHang,
fldNgayDH As NgayDH,
fldNgayGH As NgayGH,
fldTenKH As TenKH,
fldMaKH As MaKH,
fldMAsP As MAsP,
fldMAsPKhach As MAsPKhach,
fldMaQuai As MaQuai,
fldMaDe As MaDe,
fldMaMatTay As MaMatTay,
fldMauSac As MauSac,
fldChatLieu As ChatLieu,
fldHieuIn As HieuIn,
fldNhomSizeQuai As NhomSizeQuai,
fldChiTietQuai As ChiTietQuai,
fldNhomSizeDe As NhomSizeDe,
fldChiTietDe As ChiTietDe,
fldTimeRowDH As TimeRowDH,
IIF(fldNgayNhan>0,'X','') As NgayNhan,
fldSize38 As PCSize38, 0 As SXSize38,
fldSize39 As PCSize39, 0 As SXSize39,
fldSize40 As PCSize40, 0 As SXSize40,
fldSize41 As PCSize41, 0 As SXSize41,
fldSize42 As PCSize42, 0 As SXSize42,
fldSize43 As PCSize43, 0 As SXSize43,
fldSize44 As PCSize44, 0 As SXSize44,
fldSize45 As PCSize45, 0 As SXSize45,
fldSize46 As PCSize46, 0 As SXSize46,
fldTongSL As PCTong, 0 As SXTong
FROM [tblPhanCong]
UNION ALL SELECT
fldToNhom As ToNhom,
fldLenhSX As LenhSanXuat,
fldNgayCap As NgayCap,
fldDonHang As DonHang,
fldNgayDH As NgayDH,
fldNgayGH As NgayGH,
fldTenKH As TenKH,
fldMaKH As MaKH,
fldMAsP As MAsP,
fldMAsPKhach As MAsPKhach,
fldMaQuai As MaQuai,
fldMaDe As MaDe,
fldMaMatTay As MaMatTay,
fldMauSac As MauSac,
fldChatLieu As ChatLieu,
fldHieuIn As HieuIn,
fldNhomSizeQuai As NhomSizeQuai,
fldChiTietQuai As ChiTietQuai,
fldNhomSizeDe As NhomSizeDe,
fldChiTietDe As ChiTietDe,
fldTimeRowDH As TimeRowDH,
IIF(fldNgayNhan>0,'X','') As NgayNhan,
0 As PCSize38, fldSize38 As SXSize38,
0 As PCSize39, fldSize39 As SXSize39,
0 As PCSize40, fldSize40 As SXSize40,
0 As PCSize41, fldSize41 As SXSize41,
0 As PCSize42, fldSize42 As SXSize42,
0 As PCSize43, fldSize43 As SXSize43,
0 As PCSize44, fldSize44 As SXSize44,
0 As PCSize45, fldSize45 As SXSize45,
0 As PCSize46, fldSize46 As SXSize46,
0 As PCTong, fldTongSL As SXTong
FROM [tblSanXuat]
WHERE fldPhanLoai<>'BTP')  AS [%$##@_AliAs]
GROUP BY ToNhom, LenhSanXuat, NgayCap, DonHang, NgayDH, NgayGH, TenKH, MaKH, MAsP, MAsPKhach, MaQuai, MaDe, MaMatTay, MauSac, ChatLieu, HieuIn, NhomSizeQuai, ChiTietQuai, NhomSizeDe, ChiTietDe, TimeRowDH, NgayNhan;

Sau khi chạy truy vấn, không hiểu sao cái phần này [ Sum(PCSize38) AS PC38, Sum(PCSize39) AS PC39, Sum(PCSize40) AS PC40, Sum(PCSize41) AS PC41, Sum(PCSize42) AS PC42, Sum(PCSize43) AS PC43, Sum(PCSize44) AS PC44, Sum(PCSize45) AS PC45, Sum(PCSize46) AS PC46, Sum(PCTong) AS TongPC ] các cột nó cho ra kết quả.
nhưng phần này [ Sum(SXSize38) AS SX38, Sum(SXSize39) AS SX39, Sum(SXSize40) AS SX40, Sum(SXSize41) AS SX41, Sum(SXSize42) AS SX42, Sum(SXSize43) AS SX43, Sum(SXSize44) AS SX44, Sum(SXSize45) AS SX45, Sum(SXSize46) AS SX46, Sum(SXTong) AS TongSX ] các cột nó không cho ra kết quả.

Các anh chị hiểu biết về CSDL có thể giúp tôi hiểu nguyên do hoặc chỉ cho tôi biết nó sai chỗ nào không?

Lưu ý: Cũng cấu trúc trên, nhưng tôi làm từ các table khác nó vẫn cho ra kết quả.
 

File đính kèm

  • DatabaseNEW.rar
    57.9 KB · Đọc: 6
nhưng phần này ... các cột nó không cho ra kết quả.
Theo tôi thấy thì nó ra kết quả 0 chứ không phải không ra kết quả. Nếu kết quả 0 là sai thì xem lại chỗ điều kiện Where:
WHERE fldPhanLoai<>'BTP'
thực tế thì TblSX có 4 dòng, cả 4 có fldPhanLoai = rỗng
thử điền 1 vài ký tự (không phải 'BTP') vào 1 vài dòng cho khác rỗng thì kết quả sẽ thay đổi, Sum ứng với những dòng khác rỗng đó. Tuy vậy query phức tạp quá nên còn nguyên nhân khác nữa, tối xem tiếp.
 
Tuyệt vời, "gãi đúng chỗ ngứa" rồi! Cám ơn anh Mỹ, chỉ cần biết rõ nguyên do thì sẽ giải quyết vấn đề một cách dễ dàng.
Theo tôi thấy thì nó ra kết quả 0 chứ không phải không ra kết quả. Nếu kết quả 0 là sai thì xem lại chỗ điều kiện Where:
WHERE fldPhanLoai<>'BTP'
thực tế thì TblSX có 4 dòng, cả 4 có fldPhanLoai = rỗng
thử điền 1 vài ký tự (không phải 'BTP') vào 1 vài dòng cho khác rỗng thì kết quả sẽ thay đổi, Sum ứng với những dòng khác rỗng đó. Tuy vậy query phức tạp quá nên còn nguyên nhân khác nữa, tối xem tiếp.
Bài đã được tự động gộp:

Cái Field của Access nó lạ chỗ là khi ô rỗng, có khi nó chứa dữ liệu Null và cũng có khi nó chứa rỗng ('') và khi nó là Null thì bẫy lỗi WHERE fldPhanLoai<>'BTP' thì nó "điếc".
 
Lần chỉnh sửa cuối:
...
Cái Field của Access nó lạ chỗ là khi ô rỗng, có khi nó chứa dữ liệu Null và cũng có khi nó chứa rỗng ('') và khi nó là Null thì bẫy lỗi WHERE fldPhanLoai<>'BTP' thì nó "điếc".
Mỗi phiên bản của SQL đều có hàm xử lý Null.
Access dùng hàm NZ
- String: NZ(Null, "") = "", NZ("Chuẩn Strings", "") = "Chuẩn Strings"
- Số: NZ(Null, 0) = 0, NZ(100, 0) = 100
 
Mỗi phiên bản của SQL đều có hàm xử lý Null.
Access dùng hàm NZ
- String: NZ(Null, "") = "", NZ("Chuẩn Strings", "") = "Chuẩn Strings"
- Số: NZ(Null, 0) = 0, NZ(100, 0) = 100
Cám ơn anh, em đã xử lý WHERE NZ(fldPhanLoai,'')<>'BTP' trong Access thì OK, nhưng khi lấy dữ liệu từ Query này gán lên UserForm Excel thì nó phát sinh lỗi (Underfined function 'NZ' in expression) khi load form, không biết tại sao, nên dùng WHERE IIF(ISNULL(fldPhanLoai),'',fldPhanLoai)<>'BTP' thì ổn.

1709212560514.png
 
Cái này rất rắc rối. Nó nằm đâu đó ở chỗ ba mớ references:
- 32-bit và 64-bit và OLE references:
-- OLE Automation – C:\Windows\SysWOW64\stdole2.tlb
-- OLE Automation – C:\Windows\System32\stdole2.tlb
- VBA (NZ là hàm của VBA)
-- Visual Basic for Applications – C:\Program Files\Common Files\Microsoft Shared\VBA\VBA7.1\VBE7.DLL
- Access:
-- Microsoft Office 16.0 Access database engine Object Library - C:\Program Files\Common Files\ Microsoft Shared\Office16\ACEDAO.DLL
 
Ngoại trừ việc tôi nói về rỗng ở bài 2, còn 1 việc nữa là CSDL không chuẩn:
- Nên để dữ liệu hàng dọc
- Nên tạo mối quan hệ giữa 2 bảng thông qua đơn hàng, nếu 1 đơn hàng có chỉ 1 lần phân công, nhưng nhiều lần sản xuất thì join trực tiếp 2 bảng. Nếu 1 đơn hàng lại có thể có nhiều phân công thì join thông qua mã lệnh phân công, hoặc tạo bảng duy nhất đơn hàng và join tay ba.
Như trường hợp file này, tôi tạo quan hệ trực tiếp:
1709214758666.png

Sau đó query đơn giản như sau:

Mã:
SELECT PC.fldToNhom, PC.fldLenhSX, PC.fldNgayCap, PC.fldDonHang, PC.fldNgayDH, PC.fldTenKH, PC.fldMaKH, PC.fldMaSP,
PC.fldSize38, PC.fldSize39, PC.fldSize39, PC.fldSize40, PC.fldSize41, PC.fldSize42, PC.fldSize43, PC.fldSize44, PC.fldSize45, PC.fldSize46,
Sum(SX.fldSize38) AS SX38, Sum(SX.fldSize39) AS SX39, Sum(SX.fldSize40) AS SX40, Sum(SX.fldSize41) AS SX41, Sum(SX.fldSize42) AS SX42,
Sum(SX.fldSize43) AS SX43, Sum(SX.fldSize44) AS SX44, Sum(SX.fldSize45) AS SX45, Sum(SX.fldSize46) AS SX46
FROM tblPhanCong AS PC INNER JOIN tblSanXuat AS SX ON PC.fldDonHang = SX.fldDonHang
GROUP BY PC.fldToNhom, PC.fldLenhSX, PC.fldNgayCap, PC.fldDonHang, PC.fldNgayDH, PC.fldTenKH, PC.fldMaKH, PC.fldMaSP, 
PC.fldSize38, PC.fldSize39, PC.fldSize40, PC.fldSize41, PC.fldSize42, PC.fldSize43, PC.fldSize44, PC.fldSize45, PC.fldSize46,
(IIf(IsNull([SX].[fldPhanLoai]),"",[SX].[fldPhanLoai]))
HAVING (((IIf(IsNull([SX].[fldPhanLoai]),"",[SX].[fldPhanLoai]))<>'BTP'));
 
Lần chỉnh sửa cuối:
Với công việc như trong file, và nếu dữ liệu nhiều tôi sẽ tạo ít nhất là các bảng:
1. Danh mục khách hàng
2. Danh mục mặt hàng (sản phẩm) có cột tương ứng mã SP của khách
3. Danh mục size quai kèm mã nhóm size quai
4. Danh mục đế kèm mã nhóm size đế
5. Danh mục chất liệu
6. Danh mục màu
7. Danh mục MaMatTay (không hiểu nghĩa)
9. Danh mục hiệu in
10. Danh mục phân loại (trong đó có BTP và các loại khác)
11. Danh mục đơn hàng
12. Bảng phân công cha và bảng con. Bảng con chứa sản phẩm theo hàng dọc và ràng buộc không bỏ trống các cột có liên kết.
13. Bảng lệnh sản xuất cha và bảng con. Bảng con chứa sản phẩm theo hàng dọc và ràng buộc không bỏ trống các cột có liên kết.

Đồng thời tạo các mối quan hệ tương ứng.

Như vậy sẽ thuận tiện cho việc nhập liệu trên form, và thuận tiện ra các báo cáo tổng hợp và phân tích.
Báo cáo tổng hợp theo sản phẩm, tổng hợp theo khách hàng, phân tích theo size, theo màu, ...
Phân tích theo tháng, năm, ...
Chỉ bằng pivot table.
Nếu không thì phải lập báo cáo bằng VBA.
 
Lần chỉnh sửa cuối:
Với công việc như trong file, và nếu dữ liệu nhiều tôi sẽ tạo ít nhất là các bảng:
1. Danh mục khách hàng
2. Danh mục mặt hàng (sản phẩm) có cột tương ứng mã SP của khách
3. Danh mục size quai kèm mã nhóm size quai
4. Danh mục đế kèm mã nhóm size đế
5. Danh mục chất liệu
6. Danh mục màu
7. Danh mục MaMatTay (không hiểu nghĩa)
9. Danh mục hiệu in
10. Danh mục phân loại (trong đó có BTP và các loại khác)
11. Danh mục đơn hàng
12. Bảng phân công cha và bảng con. Bảng con chứa sản phẩm theo hàng dọc và ràng buộc không bỏ trống các cột có liên kết.
13. Bảng lệnh sản xuất cha và bảng con. Bảng con chứa sản phẩm theo hàng dọc và ràng buộc không bỏ trống các cột có liên kết.

Đồng thời tạo các mối quan hệ tương ứng.

Như vậy sẽ thuận tiện cho việc nhập liệu trên form, và thuận tiện ra các báo cáo tổng hợp và phân tích.
Báo cáo tổng hợp theo sản phẩm, tổng hợp theo khách hàng, phân tích theo size, theo màu, ...
Phân tích theo tháng, năm, ...
Chỉ bằng pivot table.
Nếu không thì phải lập báo cáo bằng VBA.
Cám ơn anh đã quan tâm, những cái anh nói thì hầu như đã thực hiện và một số thứ khác kiến thức hạn chế nên ... thôi, hì hì hì.
1709222309029.png1709222486421.png1709222544270.png
 
Tôi có thử sửa Where như bài 6 của Nghĩa thì query 1 ra 2 dòng, trong khi query ở bài 8 thêm Having y hệt thì chỉ 1 dòng. (Đã edit bài thêm Having)
 
Web KT
Back
Top Bottom