Nhóm mẫu tin và gán giá trị theo nhóm có điều kiện ? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

dongtrien

Thành viên mới
Tham gia
13/12/11
Bài viết
18
Được thích
1
Trong Access mình muốn nhóm và gán dữ liệu theo điều kiện mang 2 giá trị 0 và 1 (true hoặc false) và kèm điều kiện NGAYGIAO >= #01/01/2019# and NGAYGIAO <= #31/01/2019# mình viết câu lệnh như thế nào ? dữ liệu mình để trong file excel gồm có hai sheet: original data và Result, trong đó Original data là dữ liệu gốc sheet còn lại là kết quả vấn tin mình cần, khi chạy vấn tin access, nhờ các bạn giúp đỡ vấn tin trên. http://www.mediafire.com/file/hkkw519bw2k3o9h/baitap_data2.xls/file
 
Lần chỉnh sửa cuối:
Trong Access mình muốn nhóm và gán dữ liệu theo điều kiện mang 2 giá trị 0 và 1 (true hoặc false) và kèm điều kiện NGAYGIAO >= #01/01/2019# and NGAYGIAO <= #31/01/2019# mình viết câu lệnh như thế nào ? dữ liệu mình để trong file excel gồm có hai sheet: original data và Result, trong đó Original data là dữ liệu gốc sheet còn lại là kết quả vấn tin mình cần, khi chạy vấn tin access, nhờ các bạn giúp đỡ vấn tin trên. http://www.mediafire.com/file/hkkw519bw2k3o9h/baitap_data2.xls/file
Mã:
SELECT HD, IIF(NGAYGIAO >= #2019/1/1# and NGAYGIAO <= #2019/1/31#,1,0)  AS BOOL, LOAIHD, SOLUONG, DONGIA, NGAYGIAO
FROM [Original data];
 
cho ra kết quả sai hết tất cả trường BOOL = 1
 
bạn chưa xem dữ liệu kết quả rồi điều kiện để đặt = 1 trong trường BOOL là LOAIHD = 'FBAN' và cùng số hợp đồng và trong tháng 1 ngược lai kết quả = 0 không tìm thấy FBAN trong tháng và nhóm hd điều mang kết quả = 0, đây là điều kiện để đặt giá trị 0 và 1, theo mình phải sử dụng subquery có truy vấn lồng nhau nhưng mình chưa nghĩ ra cách viết.
 
bạn chưa xem dữ liệu kết quả rồi điều kiện để đặt = 1 trong trường BOOL là LOAIHD = 'FBAN' và cùng số hợp đồng và trong tháng 1 ngược lai kết quả = 0 không tìm thấy FBAN trong tháng và nhóm hd điều mang kết quả = 0, đây là điều kiện để đặt giá trị 0 và 1, theo mình phải sử dụng subquery có truy vấn lồng nhau nhưng mình chưa nghĩ ra cách viết.
Bạn phải nói rỏ điều kiện ngay từ đầu
Mã:
SELECT HD, IIf(NGAYGIAO>=#1/1/2019# And NGAYGIAO<=#1/31/2019# And HD IN(SELECT HD
FROM [Original data] where LOAIHD="FBAN"),1,0) AS BOOL, LOAIHD, SOLUONG, DONGIA, NGAYGIAO
FROM [Original data];
 
Bạn phải nói rỏ điều kiện ngay từ đầu
Mã:
SELECT HD, IIf(NGAYGIAO>=#1/1/2019# And NGAYGIAO<=#1/31/2019# And HD IN(SELECT HD
FROM [Original data] where LOAIHD="FBAN"),1,0) AS BOOL, LOAIHD, SOLUONG, DONGIA, NGAYGIAO
FROM [Original data];

Subquery :
SELECT HD FROM [Original data] where LOAIHD="FBAN"

FullQuery:
dùng right outer join bảng chính với subquery. Xét nếu cái HD bên subquery là Null thì là không có.

Tổng quát:
muốn lượt ngày nằm trong tháng thì dùng Format(NgayGiao, "yyyymm") = "201901"
Dùng NGAYGIAO<=#1/31/2019# khá nguy hiểm nếu ngày ấy có chứa giờ. Thường thì người ta dùng hàm để chắc ăn là nó không chứa giờ, hoặc dùng biểu thức NGAYGIAO< #2/1/2019#
Chung chung thì nếu phải dùng ngày, nên viết theo dạng #yyyy/mm/dd# thì sẽ tránh được sự rắc rối về định dạng ngày của hệ thống.
 
Subquery :
SELECT HD FROM [Original data] where LOAIHD="FBAN"

FullQuery:
dùng right outer join bảng chính với subquery. Xét nếu cái HD bên subquery là Null thì là không có.

Tổng quát:
muốn lượt ngày nằm trong tháng thì dùng Format(NgayGiao, "yyyymm") = "201901"
Dùng NGAYGIAO<=#1/31/2019# khá nguy hiểm nếu ngày ấy có chứa giờ. Thường thì người ta dùng hàm để chắc ăn là nó không chứa giờ, hoặc dùng biểu thức NGAYGIAO< #2/1/2019#
Chung chung thì nếu phải dùng ngày, nên viết theo dạng #yyyy/mm/dd# thì sẽ tránh được sự rắc rối về định dạng ngày của hệ thống.
Dùng hàm Format quá hay, trước đây ít dùng các hàm thông thường chỉ dùng các hàm dạng Sum, Count ...
Dùng Join phải dựa vào Khóa chính, các trường sử dụng không có trường nào có thuộc tính khóa, mình không rỏ outer join là gì bạn giải thích để biết thêm
Chúc bạn 1 tối vui
 
Dùng hàm Format quá hay, trước đây ít dùng các hàm thông thường chỉ dùng các hàm dạng Sum, Count ...
Dùng Join phải dựa vào Khóa chính, các trường sử dụng không có trường nào có thuộc tính khóa, mình không rỏ outer join là gì bạn giải thích để biết thêm
Chúc bạn 1 tối vui

Lý thuyết "khóa" chỉ là ... lý thuyết. Trên thực tế, hễ có dạng "match" thì có thể join được.
Trong query của bạn, từ khóa IN tượng trưng cho VLookup/Lookup/Match

Inner Join bắt buộc A phải match với B mới cho nối thành A-B
Left Outer Join (ở trên tôi nhầm là right) lấy tất cả các phần tử A, cái nào match được với B thì nối vào thành A-B, cái nào không match được thì thành A-Null (A là bên trái, B là bên phải, Right Join thì ngược lại, lấy tất cả B)

Như vậy, nếu tôi Left Join xong thì chỉ cần xét vế thứ hai, nếu khác Null là có match (tương đương với IN), nếu Null là không có match (tương đương với NOT IN)
 
Lý thuyết "khóa" chỉ là ... lý thuyết. Trên thực tế, hễ có dạng "match" thì có thể join được.
Trong query của bạn, từ khóa IN tượng trưng cho VLookup/Lookup/Match

Inner Join bắt buộc A phải match với B mới cho nối thành A-B
Left Outer Join (ở trên tôi nhầm là right) lấy tất cả các phần tử A, cái nào match được với B thì nối vào thành A-B, cái nào không match được thì thành A-Null (A là bên trái, B là bên phải, Right Join thì ngược lại, lấy tất cả B)

Như vậy, nếu tôi Left Join xong thì chỉ cần xét vế thứ hai, nếu khác Null là có match (tương đương với IN), nếu Null là không có match (tương đương với NOT IN)
Không hình dung được cách làm, bạn dùng file của mình viết SQL cho mình và các bạn khác tìm hiểu thêm
Khuya rồi, chúc bạn ngủ ngon
 

File đính kèm

Chỉnh code ở bài #6:

SELECT Q1.HD, IIf(Format(Q1.NGAYGIAO, "yyyymm") = "201901" And Q2.HD Is Not Null, 1, 0) As BOOL
, Q1.LOAIHD, Q1.SOLUONG, Q1.DONGIA, Q1.NGAYGIAO
FROM [Original data] Q1
Left Outer Join (Select * From [Original data] Where LOAIHD="FBAN") Q2
On Q1.HD = Q2.HD

Chỉnh lại lần nữa cho đúng với cách thường dùng của Join:

SELECT Q1.HD, IIf(Format(Q1.NGAYGIAO, "yyyymm") = "201901" And Q2.HD Is Not Null, 1, 0) As BOOL
, Q1.LOAIHD, Q1.SOLUONG, Q1.DONGIA, Q1.NGAYGIAO
FROM [Original data] Q1
Left Outer Join [Original data] Q2
On (Q1.HD = Q2.HD And Q2.LOAIHD="FBAN")

Chú: tôi chỉ nhìn code của bạn và chỉnh nó. Yêu cầu của thớt tôi khong quan tâm, vì tôi cũng chả hiểu thớt muốn gì.

Kết: join là phép tính căn bản của CSDL LH. Hầu như tất cả các CSDL LH đều có thuật toán tính phép join rất hiệu quả. Vì vậy, ở hầu hết các trường hợp, Left Join sẽ nhanh hơn phép xét IN nhiều.
 
Lần chỉnh sửa cuối:
Chỉnh code ở bài #6:

SELECT Q1.HD, IIf(Format(Q1.NGAYGIAO, "yyyymm") = "201901" And Q2.HD Is Not Null, 1, 0) As BOOL
, Q1.LOAIHD, Q1.SOLUONG, Q1.DONGIA, Q1.NGAYGIAO
FROM [Original data] Q1
Left Outer Join (Select * From [Original data] Where LOAIHD="FBAN") Q2
On Q1.HD = Q2.HD

Chỉnh lại lần nữa cho đúng với cách thường dùng của Join:

SELECT Q1.HD, IIf(Format(Q1.NGAYGIAO, "yyyymm") = "201901" And Q2.HD Is Not Null, 1, 0) As BOOL
, Q1.LOAIHD, Q1.SOLUONG, Q1.DONGIA, Q1.NGAYGIAO
FROM [Original data] Q1
Left Outer Join [Original data] Q2
On (Q1.HD = Q2.HD And Q2.LOAIHD="FBAN")

Chú: tôi chỉ nhìn code của bạn và chỉnh nó. Yêu cầu của thớt tôi khong quan tâm, vì tôi cũng chả hiểu thớt muốn gì.

Kết: join là phép tính căn bản của CSDL LH. Hầu như tất cả các CSDL LH đều có thuật toán tính phép join rất hiệu quả. Vì vậy, ở hầu hết các trường hợp, Left Join sẽ nhanh hơn phép xét IN nhiều.
Cách dùng Join của bạn quá hay, theo hướng nầy giải quyết được nhiều bài toán phức tạp
Chúc bạn vui cả ngày
 
Ví dụ rõ ràng hơn cho các bạn chưa hiểu lắm về phép join:

Mã:
Bang1                     Bang2
trg1   trg2    trg3       trg1   trg2
123    ToTe    abc        111    def
125    TeTi    def        222    xyz
212    TeTo    hij        333    hij
255    Tung    pop        444    bca
377    Xeng    bca

Select Bang1.*, Bang2.* From Bang1 Inner Join Bang2 On Bang1.trg3 = Bang2.trg2
KQ:
trg1   trg2    trg3   trg1   trg2
125    TeTi    def    111    def
212    TeTo    hij    333    hij
377    Xeng    bca    444    bca

Select Bang1.*, Bang2.* From Bang1 Left Join Bang2 On Bang1.trg3 = Bang2.trg2
KQ:
trg1   trg2    trg3   trg1   trg2
123    ToTe    abc    Null   Null
125    TeTi    def    111    def
212    TeTo    hij    333    hij
255    Tung    pop    Null   Null
377    Xeng    bca    444    bca

Chú thích: tôi cố tình đặt tên trường trệch 1 số (trg3 trong Bang1 và trg2 trong Bang2) để cho thấy phép join không hề đòi hỏi trường nào phải được đặt là khoá cả.
Ý niệm "khoá ngoại, khoá nội" trong trường hợp này chỉ là hiểu ngầm.
 
1. Không phải không quan tâm mình bận tí việc mình còn nhiều câu hỏi khó về vấn tin trên access mình đang gặp phải khi rãnh mình sẽ đưa lên, giờ rãnh mình sẽ trao đổi với các bạn, đoạn code của bạn HieuCD này chạy trên máy vẫn còn vài chổ sai mình đang tìm nguyên nhân có lẽ do mình trích 1 phần dữ liệu ra gửi diễn đàn và bớt đi điều kiện cho dể hình dung kết quả cần lấy hoặc mình đang sử dụng phiên bản access 2003 thấp hơn các bạn đã gửi file cho mình (do cty đang sử dụng phiên bản access 2003 nếu nâng lên phiên bản mới phải điều chỉnh code lại nhiều lắm nên mình phải theo).
Mã:
SELECT HD, IIf(NGAYGIAO>=#1/1/2019# And NGAYGIAO<=#1/31/2019# And HD IN(SELECT HD
FROM [Original data] where LOAIHD="FBAN"),1,0) AS BOOL, LOAIHD, SOLUONG, DONGIA, NGAYGIAO
FROM [Original data];

2. bạn HieuCD có gửi Database1.rar mình chạy file này cho kết quả đúng nhưng áp code vào chương trình vẫn còn vài chổ không đúng khi gán giá trị 0 và 1, thứ 2 mình cần là lấy theo ngày có dạng #dd/MM/yyyy# hoặc #yyyy/MM/dd# hoặc #MM/dd/yyyy# vì mình cần lấy báo cáo theo ngày, theo tuần hoặc theo tháng nên trường hợp #yyyy/MM# không phù hợp với mình, nếu mình tìm không ra lỗi mình sẽ trích xuất dữ liệu lại với điều kiện nhiều hơn.

3. dữ liệu mình chỉ nằm trên 1 Table duy nhất nên trường hợp này các bạn sử dụng Left Join , Right Join,... cho 2 Table này mình nghĩ sẽ không đụng đến. trong trường hợp dữ liệu nằm ở nhiều Table mình sẽ hỏi.
 
1. Không phải không quan tâm mình bận tí việc mình còn nhiều câu hỏi khó về vấn tin trên access mình đang gặp phải khi rãnh mình sẽ đưa lên, giờ rãnh mình sẽ trao đổi với các bạn, đoạn code của bạn HieuCD này chạy trên máy vẫn còn vài chổ sai mình đang tìm nguyên nhân có lẽ do mình trích 1 phần dữ liệu ra gửi diễn đàn và bớt đi điều kiện cho dể hình dung kết quả cần lấy hoặc mình đang sử dụng phiên bản access 2003 thấp hơn các bạn đã gửi file cho mình (do cty đang sử dụng phiên bản access 2003 nếu nâng lên phiên bản mới phải điều chỉnh code lại nhiều lắm nên mình phải theo).
Mã:
SELECT HD, IIf(NGAYGIAO>=#1/1/2019# And NGAYGIAO<=#1/31/2019# And HD IN(SELECT HD
FROM [Original data] where LOAIHD="FBAN"),1,0) AS BOOL, LOAIHD, SOLUONG, DONGIA, NGAYGIAO
FROM [Original data];

2. bạn HieuCD có gửi Database1.rar mình chạy file này cho kết quả đúng nhưng áp code vào chương trình vẫn còn vài chổ không đúng khi gán giá trị 0 và 1, thứ 2 mình cần là lấy theo ngày có dạng #dd/MM/yyyy# hoặc #yyyy/MM/dd# hoặc #MM/dd/yyyy# vì mình cần lấy báo cáo theo ngày, theo tuần hoặc theo tháng nên trường hợp #yyyy/MM# không phù hợp với mình, nếu mình tìm không ra lỗi mình sẽ trích xuất dữ liệu lại với điều kiện nhiều hơn.

3. dữ liệu mình chỉ nằm trên 1 Table duy nhất nên trường hợp này các bạn sử dụng Left Join , Right Join,... cho 2 Table này mình nghĩ sẽ không đụng đến. trong trường hợp dữ liệu nằm ở nhiều Table mình sẽ hỏi.
Các SQL trên là dạng cơ bản chạy được trên các phiên bản khác nhau
Kết quả lệ thuộc vào điều kiện xét và dữ liệu thực tế, không có file thực không thể biết "vài chổ không đúng" là do cái gì
 
Mình cũng tìm ra nguyên nhân rồi bạn, điều kiện lấy NGAYGIAO trong tháng phải nằm cùng với điều kiện FBAN

Mã:
câu lệnh này của bạn
IIf(((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#)) AND HD In (SELECT HD FROM HDBAN where LOAIHD='FBAN',1) AS BOOL

phải sửa câu lệnh của bạn thành
IIf(HD In (SELECT HD FROM HDBAN where LOAIHD='FBAN' AND ((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#)),1) AS BOOL


bạn xem code ở dưới vấn đề thứ 2 mình gặp phải NGAYGIAO xuất hiện 2 lần mình giảm bớt câu lệnh trùng lặp này:
((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#))
Mã:
SELECT HDBAN.HD, IIf(HD In (SELECT HD FROM HDBAN where LOAIHD='FBAN' AND ((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#)),1) AS BOOL, HDBAN.LOAIHD, HDBAN.SOLUONG, HDBAN.DONGIA, HDBAN.NGAYGIAO, HDBAN.CHINHANH
FROM HDBAN
WHERE (((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#));

theo bạn có giảm câu lệnh NGAYGIAO trên được không ?
 
Các SQL trên là dạng cơ bản chạy được trên các phiên bản khác nhau
Kết quả lệ thuộc vào điều kiện xét và dữ liệu thực tế, không có file thực không thể biết "vài chổ không đúng" là do cái gì
Phiên bản SQL:
Hàm IIF là hàm của Access, mọi đời từ 1997.
Khi nào qua TSQL hay mySQL mới cần sửa, với Access thì không cần phải lý luận thêm.

Dữ liệu thực tế:
Join là join, như tôi đã nói ở trên, trường hợp này dựa trên ý tưởng của match (*), khi bạn match, đâu có cần phải hai sheet khác nhau. Vậy thì không có lý do gì mà 1 bảng tự join nó không được.
Lập luận trong câu 3. trong bài #14 của thớt là hoàn toàn sai lầm; mức hiểu biết về CSDL LH chưa đạt căn bản.

(*) thực ra CSDL LH (Relational Database) dựa trên lý thuyết tập hợp (Set Theory). Inner Join là phép giao (intersect) giữa hai tập hợp.
 
Tổng quát:
muốn lượt ngày nằm trong tháng thì dùng Format(NgayGiao, "yyyymm") = "201901"
Dùng NGAYGIAO<=#1/31/2019# khá nguy hiểm nếu ngày ấy có chứa giờ. Thường thì người ta dùng hàm để chắc ăn là nó không chứa giờ, hoặc dùng biểu thức NGAYGIAO< #2/1/2019#
Chung chung thì nếu phải dùng ngày, nên viết theo dạng #yyyy/mm/dd# thì sẽ tránh được sự rắc rối về định dạng ngày của hệ thống.

Vụ ngày + giờ anh VietMini nói rất đúng mà nhiều người ít để ý đến chi tiết này. Không biết bên Excel như thế nào chứ bên Access là dễ đau đầu với các truy vấn liên quan đến dữ liệu dạng Date.
Vì chủ thớt đang thiết kế bên Access nên cũng góp ý thêm về dữ liệu dạng Date/Time bên Access.
- Access có kiểu dữ liệu dạng "Date/Time" và khi chọn Format: kiểu ShortDate nhưng không phải Access chỉ lưu "Ngày/tháng/năm" mà nó luôn luôn (mặc định) lưu có thêm giờ/ phút giây đi theo nó nhưng hiển thị thì chỉ "ngày/tháng/năm". Vd: 2019-03-28 12:52:05. Do đó nếu dữ liệu cột [Ngày] của bạn tổng hợp từ code VBA lấy từ hàm Now() hoặc từ nguồn dữ liệu khác (như máy chấm công, luôn có kèm giờ phút) v.v.. sẽ dễ dẫn đến dữ liệu truy vấn trả về có thể phát sinh sai sót.
Ví dụ: dữ liệu chấm công: "28/03/2018 8:05:10" --> nếu bạn truy vấn ngày #28/03/2019# nó sẽ không trả về kết quả vì ngày bạn đang truy vấn là: #28/03/2019 00:00:00# --> nếu truy vấn: [Ngay] >=#28/03/2019# And [Ngay] <#29/03/2019# thì sẽ ra kết quả.
- Dữ liệu ngày gõ tay hoặc lấy từ hàm Date() sẽ cho giờ phút giây là 00:00:00.
- Vấn đề nữa là Access chỉ nhận dạng đúng ngày tháng kiểu Mỹ - #mm/dd/yyyy# hoặc theo chuẩn quốc tế như anh VietMini có để cập là #yyyy-mm-dd#. Do đó khi truy vấn hoặc xử lý trong code VBA, bạn nên dùng hàm Format() chuyển về 1 trong 2 dạng trên để Access xử lý đúng, tốt nhất là kiểu quốc tế #yyyy-mm-dd#. Còn bạn muốn hiển thị trên Form, Report thì cứ dùng hàm Format() chuyển về kiểu #dd/mm/yyyy# cho dễ nhìn thôi.
- Có thể dùng BETWEEN #yyyy-mm-dd# AND #yyyy-mm-dd# thay cho >= và <= để gọn hơn chút. Tôi chưa thấy sai số giữa 2 cách dùng này.


Nói về ứng dụng của Sub query của chính nó rất hay và áp dụng cho nhiều trường hợp trong thực tế.
Cụ thể là: tìm giá trị của một dòng trước nó, tìm có điều kiện v.v..
Các ví dụ tôi áp dụng như:
- Tính giá số điện tiêu thụ tháng trước sau khi ghi điện, tính số km xe chạy được.
- Tính N-X-T
Ví dụ: một cách tính NXT đơn giản với subquery



Mã:
SELECT NgayPS, MaHang,Nz((
SELECT Nz(Sum(Nhap)) - Nz(Sum(Xuat))
FROM tblNX AS Prev
WHERE (((Prev.NgayPS) < tblNX.NgayPS))
GROUP BY tblNX.NgayPS 
))  AS TonDau, Nhap, Xuat, Nz(TonDau)+Nz(Nhap)-Nz(Xuat) AS TonCuoi
FROM tblNX;
 
Lần chỉnh sửa cuối:
Mình cũng tìm ra nguyên nhân rồi bạn, điều kiện lấy NGAYGIAO trong tháng phải nằm cùng với điều kiện FBAN

Mã:
câu lệnh này của bạn
IIf(((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#)) AND HD In (SELECT HD FROM HDBAN where LOAIHD='FBAN',1) AS BOOL

phải sửa câu lệnh của bạn thành
IIf(HD In (SELECT HD FROM HDBAN where LOAIHD='FBAN' AND ((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#)),1) AS BOOL


bạn xem code ở dưới vấn đề thứ 2 mình gặp phải NGAYGIAO xuất hiện 2 lần mình giảm bớt câu lệnh trùng lặp này:
((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#))
Mã:
SELECT HDBAN.HD, IIf(HD In (SELECT HD FROM HDBAN where LOAIHD='FBAN' AND ((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#)),1) AS BOOL, HDBAN.LOAIHD, HDBAN.SOLUONG, HDBAN.DONGIA, HDBAN.NGAYGIAO, HDBAN.CHINHANH
FROM HDBAN
WHERE (((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#));

theo bạn có giảm câu lệnh NGAYGIAO trên được không ?
Ngày tháng bạn nên chuyển thành dạng #yyyy/mm/dd# chuẩn hơn
Điều kiện xét truy vấn của mình và của bạn khác nhau nên kết quả khác nhau vì 1 HD có nhiều ngày giao
Truy vấn thứ 2 không rút gọn điều kiện NGAYGIAO được vì vai trò của 2 điều kiện khác nhau theo điều kiện của bạn, nếu theo điều kiện của mình thì bỏ được trong subquery
 
...
- Có thể dùng BETWEEN #yyyy-mm-dd# AND #yyyy-mm-dd# thay cho >= và <= để gọn hơn chút. Tôi chưa thấy sai số giữa 2 cách dùng này.

BETWEEN đúng là tiêu chuẩn SQL. Tất nhiên là dùng nó sẽ gọn hơn. Và nó chính là cách nên dùng.

Chú thích:
Toán tử BETWEEN chỉ đề cập đến vế trái so sánh 1 lần. Toán tử >= And <= đề cập đến vế trái 2 lần.
Nếu vế trái chỉ là một biến (variable/item) hay trường (field) thì cách hoạt động in hệt nhau. Trên thực tế, các phần mềm có tối ưu hoá sẽ tự chỉnh quy trình vận hành (execution plan) ra in hệt nhau.
Tuy nhiên, nếu vế trái là một biểu thức hoặc hàm (phải tính toán) thì BETWEEN chỉ tính 1 lần trong khi loại so sánh >=&<= kia phải tính biểu thức 2 lần.
FuncA(abc) BETWEEN x AND y
FuncA(abc) >= x AND FuncA(abc) <= y
Trường hợp này, chọn lựa cách nào là do nhu cầu chạy hàm 1 hay 2 lần chứ không phải do cái nào gọn hơn.

...Truy vấn thứ 2 không rút gọn điều kiện NGAYGIAO được vì vai trò của 2 điều kiện khác nhau theo điều kiện của bạn, nếu theo điều kiện của mình thì bỏ được trong subquery
Cách làm của thớt trong bài #16 là truy vấn liên hệ nội (correlated). Câu lệnh không tương đương. Nó là truy vấn khác, không phải là rút gọn.
 
Lần chỉnh sửa cuối:
1. trường hợp bạn VetMini trình bày #11 cách này cũng hay, do lúc đầu mình mới xem thoáng qua thấy sử dụng 2 table mình chưa xem kỹ.
2. theo lý thuyết mình đọc là khuyên dùng BETWEEN nhưng thực tế chương trình của cty chạy thỉnh thoảng xảy ra lỗi nên mình mới chuyển sang cách dài hơn ít bị lỗi, theo mình ít gây lỗi là mình sử dụng. Không biết các bạn đọc bài viết của mình có bạn nào đã từng sử dụng SQL Server 2005 để vấn tin ? hàm BETWEEN không lấy được mẫu tin có giờ vượt qua 12h trưa cùng ngày, nên mình cũng quen cách dài này.
3. theo đoạn code phía dưới này, mình có thể chỉnh sửa code lại để ẩn các cột, trừ cột số lượng để tính tổng số lượng xuất ra một dòng thay vì xuất ra nhiều dòng ? chắc là không được vì trường hợp này có biểu thức [BOOL].
Mã:
SELECT HDBAN.HD, IIf(HD In (SELECT HD FROM HDBAN where LOAIHD='FBAN' AND ((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#)),1) AS BOOL, HDBAN.LOAIHD, HDBAN.SOLUONG, HDBAN.DONGIA, HDBAN.NGAYGIAO, HDBAN.CHINHANH
FROM HDBAN
WHERE (((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#));
 
1. trường hợp bạn VetMini trình bày #11 cách này cũng hay, do lúc đầu mình mới xem thoáng qua thấy sử dụng 2 table mình chưa xem kỹ.
2. theo lý thuyết mình đọc là khuyên dùng BETWEEN nhưng thực tế chương trình của cty chạy thỉnh thoảng xảy ra lỗi nên mình mới chuyển sang cách dài hơn ít bị lỗi, theo mình ít gây lỗi là mình sử dụng. Không biết các bạn đọc bài viết của mình có bạn nào đã từng sử dụng SQL Server 2005 để vấn tin ? hàm BETWEEN không lấy được mẫu tin có giờ vượt qua 12h trưa cùng ngày, nên mình cũng quen cách dài này.
3. theo đoạn code phía dưới này, mình có thể chỉnh sửa code lại để ẩn các cột, trừ cột số lượng để tính tổng số lượng xuất ra một dòng thay vì xuất ra nhiều dòng ? chắc là không được vì trường hợp này có biểu thức [BOOL].
Mã:
SELECT HDBAN.HD, IIf(HD In (SELECT HD FROM HDBAN where LOAIHD='FBAN' AND ((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#)),1) AS BOOL, HDBAN.LOAIHD, HDBAN.SOLUONG, HDBAN.DONGIA, HDBAN.NGAYGIAO, HDBAN.CHINHANH
FROM HDBAN
WHERE (((HDBAN.NGAYGIAO)>=#1/1/2019# And (HDBAN.NGAYGIAO)<=#1/31/2019#));
Thử
Mã:
Select Sum(SOLUONG) As TONG
From HDBAN
Where HD In (Select  HD From HDBAN Where LOAIHD='FBAN' And (NGAYGIAO>=#2019/1/1# And NGAYGIAO<=#2019/1/31#)) ;
 
Câu 2., bài #21: bó tay.
 
1. Tính tổng số lượng theo điều kiện bài #22 sẽ cho ra kết quả không đúng, còn nếu bỏ dấu tích không cho hiện cột [BOOL] thì khi chạy sẽ báo: "Enter Parmater Value [BOOL]: " chưa thể tính SUM được.
Mã:
Select Sum(SOLUONG) As TONG
From HDBAN
Where HD In (Select  HD From HDBAN Where LOAIHD='FBAN' And (NGAYGIAO>=#2019/1/1# And NGAYGIAO<=#2019/1/31#)) ;

2. Ở chế độ thiết kế SQL của access nếu vấn tin đó nhiều và phức tạp sẽ hơi khó nhìn, các bạn có biết phần mềm nào nó hổ trợ định dạng câu lệnh vấn tin SQL của access cho dể nhìn hơn ?

3. bạn ongke0711 ở bài viết #18 hình như đã lập trình phần mềm cho máy chấm công thì phải ? nhân tiện đây mình hỏi máy chấm công hiệu Ronald jack x628-C mình xuất dữ liệu vân tay từ máy ra gồm có 2 file: data.dat và device.dat khi xuất máy báo OK xuất file không bị lỗi file, hai file này mình import vào máy mới cùng hiệu nhưng bị báo lỗi: "IP lỗi Error Input!" Restore the data to the device, and the data must be the backup BIN data passing the backup function before, bạn biết lỗi này khắc phục như thế nào ? ngoài ra bạn có đĩa SDK của dòng máy này ? đây là câu hỏi ngoài bài viết mà trên trang này không thấy mục này, các bạn thông cảm nhé.
 
1. Tính tổng số lượng theo điều kiện bài #22 sẽ cho ra kết quả không đúng, còn nếu bỏ dấu tích không cho hiện cột [BOOL] thì khi chạy sẽ báo: "Enter Parmater Value [BOOL]: " chưa thể tính SUM được.
Thấy dùng sub query ào ào, hàm Sum không tính được, bó tay chấm xôi
 
Thấy dùng sub query ào ào, hàm Sum không tính được, bó tay chấm xôi
Query ở bài #22 sẽ cho ra một con số duy nhất, đó là tổng của tất cả những dòng HDBAN mà trong đó có ít nhất một dòng HDBAN thoả điều kiện LOAIHD và NGAYGIAO.
Ví dụ tôi có HD "abcd", HD này có tất cả 5 dòng (records). Trong số 5 dòng này chỉ cần 1 dòng có LOAIHD là "FBAN" và NGAYGIAO trong tháng 01/2019 thì tôi sẽ được tổng của cả 5 dòng đó (cộng tất cả những HD tương tự)

Ở trên, thớt lẩm bẩm cái chỗ BOOL là do không biết mình muốn gì. Thực ra thì ngừoi ta phải dùng 2 truy vấn riêng biệt. Một truy vấn tổng những HD thoả (1) và một cho những HD không thoả (0). Nếu muốn gộp vào 1 chỗ thì có thể dùng group.
 
1. Tính tổng số lượng theo điều kiện bài #22 sẽ cho ra kết quả không đúng, còn nếu bỏ dấu tích không cho hiện cột [BOOL] thì khi chạy sẽ báo: "Enter Parmater Value [BOOL]: " chưa thể tính SUM được.

2. Ở chế độ thiết kế SQL của access nếu vấn tin đó nhiều và phức tạp sẽ hơi khó nhìn, các bạn có biết phần mềm nào nó hổ trợ định dạng câu lệnh vấn tin SQL của access cho dể nhìn hơn ?

3. bạn ongke0711 ở bài viết #18 hình như đã lập trình phần mềm cho máy chấm công thì phải ? nhân tiện đây mình hỏi máy chấm công hiệu Ronald jack x628-C mình xuất dữ liệu vân tay từ máy ra gồm có 2 file: data.dat và device.dat khi xuất máy báo OK xuất file không bị lỗi file, hai file này mình import vào máy mới cùng hiệu nhưng bị báo lỗi: "IP lỗi Error Input!" Restore the data to the device, and the data must be the backup BIN data passing the backup function before, bạn biết lỗi này khắc phục như thế nào ? ngoài ra bạn có đĩa SDK của dòng máy này ? đây là câu hỏi ngoài bài viết mà trên trang này không thấy mục này, các bạn thông cảm nhé.

1. Tôi nghĩ bạn nên nói rõ lại bài toán cuối cùng bạn muốn là gì với cái dữ liệu Excel đang có. Có thể có những giải thuật khác nhau để đạt kết quả thay vì phải thông qua cách bạn đang làm là tạo trường BOOL rồi xử lý SUM gì đó.

2. Đối vói query đơn giản thì dùng lưới Query còn nhưng query phức tạp có lồng subquery thì bạn chỉ còn cách xem và xử lý trên khung SQL View thôi.

3. Tôi không có lập trình máy chấm công mà chỉ lấy dữ liệu từ máy đưa vô ứng dụng Access để xử lý tính toán thôi bạn à. :)
 
1. Tôi nghĩ bạn nên nói rõ lại bài toán cuối cùng bạn muốn là gì với cái dữ liệu Excel đang có. Có thể có những giải thuật khác nhau để đạt kết quả thay vì phải thông qua cách bạn đang làm là tạo trường BOOL rồi xử lý SUM gì đó.

2. Đối vói query đơn giản thì dùng lưới Query còn nhưng query phức tạp có lồng subquery thì bạn chỉ còn cách xem và xử lý trên khung SQL View thôi.

1. Tôi nghĩ là thớt làm cho người khác. Chính mình cũng chưa rõ ngừoi kia muốn gì.

2. Người ta nói chuyện SQL Server như là kinh nghiệm lắm. Nhưng căn bản CSDL LH chưa nắm được. Chuyện xem code ngắn hay dài chỉ là màu mè.
Query như bàn tay thò vào túi lấy đồ. Chủ yếu tay cần nhạy bén để rờ rẩm, lấy đúng món đồ thôi chứ bàn tay nhỏ to đâu có quan trọng.
(mà hình như ở đây, món đồ hình dạng ra sao còn chưa rõ)
 
1. Các bạn đừng nóng, mình đang đi Ctác bên ngoài, không có ngồi với máy tính, thứ 2 mới về sẽ xem lại chỗ lỗi đó, nếu không được mình sẽ nhờ các bạn trợ giúp, cho mình gửi lời cảm ơn các bạn đã quan tâm đọc bài viết của mình, có các bạn quan tâm đọc bài thế này mình nghĩ bài toán khó mấy cũng sẽ giải quyết được, một lần nữa cám ơn các bạn đọc bài viết của mình.
2. bạn ongke0711 nói "đối với query đơn giản thì dùng lưới... " theo mình bạn nói chỉ đúng một phần nào thôi có những cái vấn tin phải dùng cả hai trường hợp vừa ở chế độ code SQL để sửa và vừa ở chế độ dùng lưới Query để sửa, đặt biệt ở chế độ code SQL mà nó dài khoảng 1/2 trang giấy A4 mà lỡ tay xóa đi dấu phẩy hoặc dấu ngoặc, hay câu lệnh thiếu gì đó... là sẽ báo lỗi, lúc này có trường hợp nó cho chuyển về chế độ dùng lưới Query để chỉnh sửa nhưng có cũng trường hợp nó không cho chuyển về dùng lưới Query buộc phải sửa ở chế độ code SQL, với chiều dài code SQL 1/2 trang giấy A4 hoặc hơn, ngồi mò tìm lỗi bạn sẽ thấy hơi khó chịu một tí.
 
"lỡ tay xoá đi dấu phẩy hoặc dấu ngoặc, hay câu lệnh thiếu gì đó... là sẽ báo lỗi" + "ngồi mò tìm lỗi" : a ma tơ
Chuyện đó KHÔNG XẢY RA đối với dân kinh nghiệm code.
Dân truy vấn SQL chỉ biết sợ lấy dữ liệu không đúng thôi (*). Báo lỗi là chuyện trẻ em.
 
"lỡ tay xoá đi dấu phẩy hoặc dấu ngoặc, hay câu lệnh thiếu gì đó... là sẽ báo lỗi" + "ngồi mò tìm lỗi" : a ma tơ
Chuyện đó KHÔNG XẢY RA đối với dân kinh nghiệm code.
Dân truy vấn SQL chỉ biết sợ lấy dữ liệu không đúng thôi (*). Báo lỗi là chuyện trẻ em.
Trong cái dấu * là gì đó anh, hình như anh quên ghi chú về dấu * này, em đọc chưa hiểu lắm ạ
 
Trong cái dấu * là gì đó anh, hình như anh quên ghi chú về dấu * này, em đọc chưa hiểu lắm ạ

Vợ kêu đi dọn * cháu nên bỏ dở.

Cái dấu * có nghĩa là hàng khủng.
GPE có lệ hù người ta bằng hàng khủng. Worksheet không hàng triệu dòng thì cũng hàng ngàn cột. Workbook thì vài trăm sheets. Project VBA đếm trên đơn vị hàng ngàn dòng, hàng trăm mô đun, forms.
Riêng góc CSDL này chắc ngoại lệ, 1/2 trang A4 tính đem ra hù rồi.
 
1. Các bạn nói chuyện cũng vui quá hen, tất nhiên là lỗi sẽ tìm ra rồi, lỗi này là lỗi cú pháp nhưng cách trình bày sao cho dể nhìn thôi, trình bày dể nhìn thì dể tìm ra lỗi cú pháp nhanh hơn.
2. Hôm nay mình gửi file access lên nhờ các bạn chia sẻ kinh nghiệm vấn tin giúp mình, vấn tin này cho kết quả đúng nhưng mình chưa gộp thành 1 dòng được, theo mình chưa gộp được là do trường [HD], trường này năm trong biểu thức DOANHTHU2, nếu xử lý được chổ này sẽ gộp thành 1 dòng, xem file đính kèm http://www.mediafire.com/file/25aq5xcwozss4l7/baitap.mdb/file
 
1. Mình cũng mò ra được lấy 1 dòng với điều kiện bỏ đi trường CHINHANH (bỏ điều kiện group), mình muốn lấy thêm dòng CHINHANH này bị báo lỗi trường HD như trên, mình gửi lại: http://www.mediafire.com/file/8i58rmn8fgufq9a/baitap.mdb/file
2. vấn tin trên sử dụng toán tử IN để lọc hợp đồng để tính doanh thu 2 và kết quả cuối cùng là TONGSL, TONGDOANHTHU2, vấn tin trên có thể viết lại sử dụng toán tử Exists ? mình thấy toán tử này giống với vấn tin của mình.
 
1. Mình cũng mò ra được lấy 1 dòng với điều kiện bỏ đi trường CHINHANH (bỏ điều kiện group), mình muốn lấy thêm dòng CHINHANH này bị báo lỗi trường HD như trên, mình gửi lại: http://www.mediafire.com/file/8i58rmn8fgufq9a/baitap.mdb/file
2. vấn tin trên sử dụng toán tử IN để lọc hợp đồng để tính doanh thu 2 và kết quả cuối cùng là TONGSL, TONGDOANHTHU2, vấn tin trên có thể viết lại sử dụng toán tử Exists ? mình thấy toán tử này giống với vấn tin của mình.

Thử xem nhé: sửa từ query của bạn

Mã:
SELECT A.CHINHANH, A.HD, Sum([SOLUONG]/1000) AS TONGSL, Sum(IIf(Not IsNull([DONGIATT]),[SOLUONG]*([DONGIATT]/1000000),[SOLUONG]*([DONGIA]/1000000))) AS DOANHTHU, Sum(IIf(IsNull([TTLUI]),[SOLUONG]*([DONGIA]/1000000),[SOLUONG]*([DONGIATT]/1000000))) AS DOANHTHU2, Sum(IIf(IsNull([DONGIA]),[SOLUONG]*([DONGIATT]/1000000),[SOLUONG]*([DONGIA]/1000000))) AS DOANHTHUTT, Sum(IIf(IsNull([DONGIA]) And Not IsNull([UNGTIEN]),([UNGTIEN]/1000000),[SOLUONG]*([DONGIA]/1000000))) AS DOANHTHUTU, Sum(IIf([LOAIHD]='BSSXT',[LAIGOPDTCP]/1000000)) AS BSSXT, Sum(IIf([LOAIHD]='BSFGT',[LAIGOPDTCP]/1000000)) AS BSFGT, Sum(IIf(Not IsNull([DONGIA]) And Not IsNull([DONGIATT]),([SOLUONG]*([DONGIA]-[DONGIATT]))/1000000)) AS DAFG, IIf(Not IsNull([BSFGT]) And Not IsNull([BSSXT]),[BSFGT]+[BSSXT],IIf(IsNull([BSFGT]) And Not IsNull([BSSXT]),[BSSXT],[BSFGT])) AS BSLN, IIf(Not IsNull([DOANHTHU2]) And Not IsNull([BSLN]),[DOANHTHU2]+[BSLN],IIf(IsNull([DOANHTHU2]) And Not IsNull([BSLN]),[BSLN],[DOANHTHU2])) AS TONGDOANHTHU2, IIf(Not IsNull([DOANHTHU]) And Not IsNull([BSLN]),[DOANHTHU]+[BSLN],IIf(IsNull([DOANHTHU]) And Not IsNull([BSLN]),[BSLN],[DOANHTHU])) AS TONGDOANHTHU, IIf(Not IsNull([DOANHTHUTT]) And Not IsNull([BSLN]),[DOANHTHUTT]+[BSLN],IIf(IsNull([DOANHTHUTT]) And Not IsNull([BSLN]),[BSLN],[DOANHTHUTT])) AS TONGDOANHTHUTT, IIf(Not IsNull([DOANHTHUTU]) And Not IsNull([BSLN]),[DOANHTHUTU]+[BSLN],IIf(IsNull([DOANHTHUTU]) And Not IsNull([BSLN]),[BSLN],[DOANHTHUTU])) AS TONGDOANHTHUTU
FROM HDBAN AS A
WHERE (((A.CHINHANH)="LD") AND ((A.LOAIHD) In ("GIAO","GIAO2","BSFGT","BSSXT")) AND ((A.HD) In (SELECT HD FROM HDBAN WHERE (((HDBAN.LOAIHD)='FBAN1' Or (HDBAN.LOAIHD)='FBAN2') AND ((HDBAN.NGAYGIAO)>=#1/3/2019# And (HDBAN.NGAYGIAO)<=#3/31/2019#)))))
GROUP BY A.CHINHANH, A.HD;
 
kết quả bạn sai rồi, bạn xem file đính kèm kết quả sẻ là dòng màu xanh dương (màu blue) mới đúng http://www.mediafire.com/file/y13xcyncfe6qxzp/baitap3.xls


Dữ liệu của bạn lọc thủ công chỉ có ra đúng 3 dòng HD: 0184 là có LOAI HD ="FBAN1" và số lượng 100.000 vậy làm ra 2.037?
Dữ liệu excel của bạn cũng không có cột định danh nào để xác định nó là của HD nào.
Bạn móc thủ công nhưng dòng nào đáp ứng đúng điều kiện của bạn đưa ra để đối chiếu xem.

 
Lần chỉnh sửa cuối:
1. bạn xem lại file access điều kiện LOAI HD ="FBAN" không có LOAI HD ="FBAN1"
2. file excel là file kết quả khi chạy, bạn muốn xem dữ liệu gốc nằm trong Table HDBAN access đấy
 
1. bạn xem lại file access điều kiện LOAI HD ="FBAN" không có LOAI HD ="FBAN1"
2. file excel là file kết quả khi chạy, bạn muốn xem dữ liệu gốc nằm trong Table HDBAN access đấy

Đúng là potay với bạn. Trả lời trớt quớt.
Tôi đang xử lý trên cái file .mdb bạn đưa thì làm sao mà tôi không biết dữ liệu gốc nằm trên đó hả bạn?
Vấn đề là phải có những dòng dữ liệu bạn lọc thủ công ra để đối chiếu xem query có chạy ra kết quả đúng không. Chỉ cần kiểm mẫu vài dòng dữ liệu đặc trưng cho các trường hợp mà query trích xuất.
1. Tôi chắc chắn bạn chưa kiểm tra kỹ cái table HDBAN của bạn. Chỉ có 1 record có LOAIHD ="FBAN1" thôi nhé, như cái hình tôi đã post ở trên. Chạy cái select query đơn giản là ra rồi.
2. Tôi đã nói cái dòng có font chữ màu xanh trong file excel của bạn chẳng có cột nào để xác định nó là [HD] nào thì làm sao bạn dám khẳng định cái dòng đó là đúng dữ liệu cần tổng hợp??? Nếu bạn nói dòng đó là đúng thì tôi yêu cầu bạn lọc thủ công trong table HDBAN ra những dòng nào đáp ứng đúng điều kiện tổng hợp của bạn rồi mới lại cộng thủ công xem có đúng kết quả không. Bạn chụp hình mấy record đó rồi post lên đây để xem như thế nào. Đây chỉ là cách cơ bản nhất để kiểm tra khi thiết kế query thôi mà tôi thấy bạn có vẻ không chịu hiểu.
Do khả năng đọc hiểu của tôi có hạn nên tôi rút khỏi cái thớt này vậy. Sa - yo - na - ra :cool:
 
Bạn viết:
- Dữ liệu của bạn lọc thủ công chỉ có ra đúng 3 dòng HD: 0184 là có LOAI HD ="FBAN1" và số lượng 100.000 vậy làm ra 2.037?
- Tôi chắc chắn bạn chưa kiểm tra kỹ cái table HDBAN của bạn. Chỉ có 1 record có LOAIHD ="FBAN1" thôi nhé, như cái hình tôi đã post ở trên. Chạy cái select query đơn giản là ra rồi.
- Dữ liệu excel của bạn cũng không có cột định danh nào để xác định nó là của HD nào.

1. link file access trên mình tải về kiểm tra lại dữ liệu gốc kiểm tra hợp đồng 0184 và trường LOAIHD không có mẫu tin nào là "FBAN1", mình không hiểu sao bạn tải về có "FBAN1" ? còn vấn tin qryExists trong file access mình gửi lên bị báo lỗi, không hiểu sao bạn chạy được ra 3 dòng ? báo lỗi xem file đính kèm http://www.mediafire.com/view/1hf4ik3alf7dm1p/eror_baitap3.jpg/file

Bạn viết:
- Tôi đã nói cái dòng có font chữ màu xanh trong file excel của bạn chẳng có cột nào để xác định nó là [HD] nào thì làm sao bạn dám khẳng định cái dòng đó là đúng dữ liệu cần tổng hợp??? Nếu bạn nói dòng đó là đúng thì tôi yêu cầu bạn lọc thủ công trong table HDBAN ra những dòng nào đáp ứng đúng điều kiện tổng hợp của bạn rồi mới lại cộng thủ công xem có đúng kết quả không. Bạn chụp hình mấy record đó rồi post lên đây để xem như thế nào. Đây chỉ là cách cơ bản nhất để kiểm tra khi thiết kế query thôi mà tôi thấy bạn có vẻ không chịu hiểu.

2. Dữ liệu trong file excel là kết quả chỉ xuất 1 dòng SUM mình tô màu đại diện, đã biểu thức SUM thì sao có trường [HD], thông thường kết quả 1 dòng tính đúng thì không cần xem lại chi tiết, trừ trường hợp kết quả tổng sai thì mới xem lại chi tiết để biết mẫu tin nào sai, lỗi này do bạn không nói rõ ý bạn cần bảng dữ liệu chi tiết mẫu hay kết quả số liệu cuối cùng. ngoài ra mình kiểm số liệu thức tế mình biết số nào đúng số nào sai chứ bạn. Sẵn đây gửi bản chi tiết bạn tham khảo http://www.mediafire.com/file/c1r98kskrxu14bz/baitap3A.xls/file
 
1. link file access trên mình tải về kiểm tra lại dữ liệu gốc kiểm tra hợp đồng 0184 và trường LOAIHD không có mẫu tin nào là "FBAN1", mình không hiểu sao bạn tải về có "FBAN1" ? còn vấn tin qryExists trong file access mình gửi lên bị báo lỗi, không hiểu sao bạn chạy được ra 3 dòng ? báo lỗi xem file đính kèm http://www.mediafire.com/view/1hf4ik3alf7dm1p/eror_baitap3.jpg/file

:) Đồng chí có xem kỹ cái hình 3 dòng tôi post ở trên không?ở thanh tiêu đề nó ghi [HDBAN : Table] => đó là tôi đang lọc thủ công trực tiếp trên cái table HDBAN của đồng chí đó chứ query nào ở đây. Cột [LOAIHD] nó hiện rõ "FBAN1" chứ tôi rảnh đâu mà gõ vô???
 
...
 
Lần chỉnh sửa cuối:
Mình cũng đã nói rồi mình không query mà kiểm tra trực tiếp dữ liệu gốc không có mẫu tin nào trong cột [LOAIHD] = "FBAN1" ? bạn kiểm tra dữ liệu gốc chưa ?
 

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

Back
Top Bottom