Truy vấn trong SQL?

Liên hệ QC
muốn truy vấn chuẩn thì đầu tiên phải biết datatype của các cột là gì nhé.

t-sql thì: select ... cast([cdate] as date) as xx where fieldate between '2019-07-01' and '2019-07-31'
 
Lần chỉnh sửa cuối:
A! Được rồi ạ, OT xin trân trọng cảm ơn sự quan tâm giúp đỡ của mọi người ạ.
CDATE chắc là định dạng Date nên OT thử câu lệnh:
Mã:
..WHERE CDATE between '2019-09-01' and '2019-10-01'
OK rồi ạ
 
A! Được rồi ạ, OT xin trân trọng cảm ơn sự quan tâm giúp đỡ của mọi người ạ.
CDATE chắc là định dạng Date nên OT thử câu lệnh:
Mã:
..WHERE CDATE between '2019-09-01' and '2019-10-01'
OK rồi ạ
kiểm tra mới chắc chắn đc nhé, vì trong nhiều trường sẽ xảy ra trường hợp tự ép kiểu nhé. mình dùng điện thoại nên không xem cụ thể thế nào nhưng qua phỏng đoán code trên thì cột của bạn là yyyymmdd và nó là varchar chứ không là date, date trong ms sql là yyyy-mm-dd, trong th của bạn là ép kiểu rồi.

bạn chạy câu lệnh là biết date trong ms sql fortmat chuẩn ntn: select getdate()
 
Nếu CDATE là kiểu date thì phải bảo đảm nó là Short Date, không phải DateTime.
Bởi vì >= '20190701' And < '20190801'
khác với Between '20190701' and '20190731'
Trường hợp 1 sẽ kể luôn những '20190731 23:59:59 99.99999'. Trường hợp 2 cứ 1 giây là loại rồi.
 
Dạ OT sử dụng SQL-2017 anh ạ, lại phát sinh lỗi này anh ạ:
Mã:
Msg 195, Level 15, State 10, Line 1
'DateSerial' is not a recognized built-in function name.

:) Lỗi do anh lẫn lộn giữa hàm bên VBA và SQL Server, râu ông nọ cắm cằm bà kia.
Em phải đổi NVarchar thành DateTime thì mới thực hiện các phép so sánh + - ngày tháng chính xác.
Dùng hàm DateFromParts() tương tự hàm DateSerial() trong VBA. Ngắn gọn là dùng CAST hoặc CONVERT.

Convert(nvarchar, CDATE, 23)

SELECT CODE, CDATE, QTY FROM SORDER WHERE Convert(nvarchar,CDATE,23) between '2019-09-01' And '2019-10-01'
 
Lần chỉnh sửa cuối:
Xin cảm ơn mọi người đã giúp đỡ,
OT kiểm tra trong CSDL thì nó như thế này ạ, không biết câu lệnh sẽ xử lý theo cách nào là chuẩn ạ.

222186

222187


Nhưng dù sao nhờ có sự giúp đỡ của mọi người nên vấn đề của OT cũng đã được giải quyết ạ.
 
Xin cảm ơn mọi người đã giúp đỡ,
OT kiểm tra trong CSDL thì nó như thế này ạ, không biết câu lệnh sẽ xử lý theo cách nào là chuẩn ạ.

View attachment 222186

View attachment 222187


Nhưng dù sao nhờ có sự giúp đỡ của mọi người nên vấn đề của OT cũng đã được giải quyết ạ.
bạn sử dụng hàm cast thôi cast(cdate as date) between x and y. còn k bạn k cần cast thì nó tự ép kiểu cho bạn
 
Kiếm cái thằng thiết kế CSDL mà hỏi nó số 1 ở sau có nghĩa là gì.
Điển hình đối với một số phần mềm kế toán, người ta thêm mọt ký hiệu sau ngày tháng để chỉ quý. Đối với một số nước trên thế giới tháng 7+8+9 là quý 1.

Troing hiện tại thì với yêu câù của bạn, cứ lấy 6 ký tự đầu là tháng, 8 ký tự là ngày.
Dạng YYYYMMDD đã được chuẩn để có thể so sánh theo kiểu chuỗi, không cần phải cast. Chỉ khi nào cần cộng trừ ngày tháng mới phải cast.
 
... Xin phép được xóa nội dung tại bài #30 này (OT hiểu rồi)
 
Lần chỉnh sửa cuối:
Xin chào mọi người,
Nhờ mọi người giúp đỡ OT câu lệnh Select để lấy dữ liệu từ 4 bảng sau đó tạo ra vùng dữ liệu như bảng bên dưới với ạ.

222251
 

File đính kèm

  • Book1.xlsx
    12.2 KB · Đọc: 12
Trường [Ngày tháng] không có sao bạn OT?
Nếu dữ liệu tồn kho, đơn hàng mấy năm thì máy chạy mệt à.
 
Xin chào Anh ongke0711
Dạ tất nhiên là có Anh ạ, OT chỉ ví dụ vậy để biết cách vận dụng ạ :D
Nhờ anh xem giúp ạ.

Tôi hỏi kỹ để tránh việc đưa một câu lênh T-SQL mà kết quả của nó không có ý nghĩa gì hết, rồi em áp dụng cũng không được.
Cái mấu chốt nằm ở cái table STOCK của em. Nó là tồn kho ngay tại thời điểm chạy query hay tồn đầu kỳ (từng tháng).
- Nếu là tồn đầu kỳ thì đưa vào truy vấn số lượng bán (tôi suy ra theo cái tên SOrder - Sales Order) tồn kho không chính xác vì còn phải + thêm nhập TK tính tới ngày xuất bán -> lúc đó mới có ý nghĩa: đối chiếu với tồn kho thời điểm (Quantity On Hand) trước khi xuất bán.
- Nếu đó là table tồn kho thời điểm xét thì không có gì để nói. :)
- Có trường hợp "MH001" bán cho các khách hàng khác không? vd KH002, KH005... Khi nhìn table KHACHHANG tôi lại nghĩ nó giống Nhà Cung Cấp và cái SORDER trở thành table Mua hàng (PURCHASE ORDER) hơn. Khi đó lại sẽ phát sinh các vấn đề khác về tổ chức lưu thông tin (hoặc do em cung cấp thông tin table liên quan quá ít nên không nhìn thấy tổ chức tổng thể của CSDL).
Nếu cái bảng kết quả em muốn là tồn kho và số lượng đặt hàng của từng nhà cung cấp thì table STOCK thiếu thông tin Mã NCC của từng Mã hàng tồn kho.
Nếu nói mỗi Mã Hàng chỉ có 1 NCC cố định nên gán Mã Hang đi theo NCC rồi như table KHACHANG, truy vấn từ Mã hàng sẽ ra mã NCC thì cũng sai vì chỉ nhìn ngắn hạn. Sau này có đổi mua của NCC khác thì theo dõi như thế nào? tồn kho NCC cũng, tồn kho NCC mới...

Tại tôi muốn hiểu rõ chút về quan hệ giữa các Table, các field như thế nào và thông tin từ em cung cấp cũng không nhiều nên hỏi tùm lum là vậy rồi mới ra được câu lệnh truy vấn. Chứ để ra kết quả như trên thì không có gì phức tạp.
 
Lần chỉnh sửa cuối:
Tôi hỏi kỹ để tránh việc đưa một câu lênh T-SQL mà kết quả của nó không có ý nghĩa gì hết, rồi em áp dụng cũng không được.
Cái mấu chốt nằm ở cái table STOCK của em. Nó là tồn kho ngay tại thời điểm chạy query hay tồn đầu kỳ (từng tháng).
- Nếu là tồn đầu kỳ thì đưa vào truy vấn số lượng bán (tôi suy ra theo cái tên SOrder - Sales Order) tồn kho không chính xác vì còn phải + thêm nhập TK tính tới ngày xuất bán -> lúc đó mới có ý nghĩa: đối chiếu với tồn kho thời điểm (Quantity On Hand) trước khi xuất bán.
- Nếu đó là table tồn kho thời điểm xét thì không có gì để nói. :)
- Có trường hợp "MH001" bán cho các khách hàng khác không? vd KH002, KH005... Khi nhìn table KHACHHANG tôi lại nghĩ nó giống Nhà Cung Cấp và cái SORDER trở thành table Mua hàng (PURCHASE ORDER) hơn. Khi đó lại sẽ phát sinh các vấn đề khác về tổ chức lưu thông tin (hoặc do em cung cấp thông tin table liên quan quá ít nên không nhìn thấy tổ chức tổng thể của CSDL).
Nếu cái bảng kết quả em muốn là tồn kho và số lượng đặt hàng của từng nhà cung cấp thì table STOCK thiếu thông tin Mã NCC của từng Mã hàng tồn kho.
Nếu nói mỗi Mã Hàng chỉ có 1 NCC cố định nên gán Mã Hang đi theo NCC rồi như table KHACHANG, truy vấn từ Mã hàng sẽ ra mã NCC thì cũng sai vì chỉ nhìn ngắn hạn. Sau này có đổi mua của NCC khác thì theo dõi như thế nào? tồn kho NCC cũng, tồn kho NCC mới...

Tại tôi muốn hiểu rõ chút về quan hệ giữa các Table, các field như thế nào và thông tin từ em cung cấp cũng không nhiều nên hỏi tùm lum là vậy rồi mới ra được câu lệnh truy vấn. Chứ để ra kết quả như trên thì không có gì phức tạp.

Xin chào ongke0711,
Cảm ơn anh đã quan tâm & giúp đỡ ạ.
Các vấn đề anh hỏi liên quan đến tính toán OT chưa nghĩ đến, có lẽ nó thuộc phần nâng cao hơn một chút ạ, các vấn đề này OT sẽ tạo thêm ví dụ khác ạ , lúc đó có gì anh lại chỉ dẫn thêm ạ.
Còn thực sự OT đang tìm hiểu về câu lệnh select Join từ nhiều bảng (tương tự hàm tìm kiếm trong Excel) thôi ạ nên đưa ví dụ minh họa đơn giản như vậy.
Cảm ơn anh nhiều ạ.
 
Quản lý hàng hoá (Inventory Control) là công việc lớn. Hệ thống quản lý nếu có đầy đủ thông tin xuất nhập tồn thì rất phức tạp. Và vì mõi cơ quan có quy trình làm việc khác nhau cho nên rất khó thiết lập.
Để thiết lập csdl, người ta có hai chọn lựa:
1. chọn một hệ thống có sẵn, và tương đối gần với quy trình của mình. Và chỉnh lại chính quy trình của mình cho phù hợp.
2. mướn chuyên viên theo dõi quy trình của mình và thiết kế mọt hệ thống thật phù hợp.

Đấy là tôi nói chỉ Inventory Control. Nếu phải theo dõi đơn đặt hàng (Purchase Orders/Sales Orders) thì còn lớn hơn nhiều.

Theo như cái bảng yêu cầu ở bài #31 thì bạn cần xem stock có đủ để cung cấp cho đơn đặt hàng hay không. Công việc này có thể thuộc về khâu quản kho nhưng cũng có thể thuộc về khâu bán hàng. Tôi doán ở đây bạn muốn nói khâu kho - nếu khâu bán hàng thì phải thêm phần ngày giao hàng và phân bổ ưu tiên khách hàng/đơn hàng khi không đủ hàng, rất rắc rối.

Nói về lý thuyết 1 chút. Theo lý thuyết CSDL LH thì bạn chỉ cần 1 bảng phát sinh nhập xuất hàng. Tồn kho ở mọi thời điểm sẽ là tổng các phát sinh kể từ ngày đầu tiên cho đến thời điểm ấy. Trên thực tế, người quản lý CSDL ai cũng biết rằng dạng CSDL LH là một con khủng long. Tình trạng lý tưởng là tối thiểu chuẩn bậc 3 (3rd order normalisation) lắm khi ảnh hưởng đến tốc độ truy vấn.

Vì vậy, những CSDL có liên quan đến khái niệm tồn đầu/tồn cuối thường được thiết kế theo dạng phân từng phần (Partitioned). Điển hình như csdl của bạn, ngừoi ta có thể thiết kế bảng Stock theo năm. Tồn đầu kỳ có nghĩa là tồn đầu năm. Và tồn tại thời điểm có nghĩa là tồn đầu năm cộng/trừ các phát sinh trong năm.

Tuy nhiên, nhìn theo hình ở bài #31 thì có lẽ bảng của bạng theo dạng tồn tại chỗ. Mỗi phát sinh sẽ cộng/trừ thẳng vào trường "tồn" trong bảng. Cái báo cáo mà bạn muốn trong bảng thứ 5 là loại báo cáo dữ liệu cấp thời (impromptu). Nói cách khác, nó chỉ có giá trị đúng vào thời điểm truy vấn, và nó giả sử rằng mọi đơn đặt hàng bán và mua đều nằm trong khoảng thời gian tính toán - cái giả sử này là điều mà tác giả bài #34 muón bạn phải khẳng định.

Tóm lại, nếu:
1. bảng 5 trong hình là báo cáo xem tình trạng tồn kho có đủ cung ứng đơn đặt hàng, VÀ
2. trường SoLuong2 chứa tồn kho đến thời điểm hiện tại, VÀ
3. trường SoLuong1 chứa số lượng nằm trong đơn đặt hàng (chưa giao)
Hội đủ 3 điều kiện trên thì câu truy vấn khá đơn giản.
 
Nếu chỉ đơn giản là tham khảo thì em thử câu lệnh này:

- Theo như hình của em, anh lấy trường [MASP] từ table DSSANPHAM.

Mã:
SELECT DSSANPHAM.MASP, DSSANPHAM.TENSP, KHACHHANG.MKH, STOCK.SOLUONG2, SORDER.SOLUONG1
FROM (KHACHHANG RIGHT JOIN (DSSANPHAM LEFT JOIN SORDER ON DSSANPHAM.MASP = SORDER.MSP) ON KHACHHANG.MASP = DSSANPHAM.MASP) LEFT JOIN STOCK ON DSSANPHAM.MASP = STOCK.MSP



- Nếu để đối chiếu tồn kho với table xuất hàng (SORDER) thì trường mã SP phải lấy từ table SORDER, khi đó câu lệnh phải đổi lại là:

Mã:
SELECT SORDER.MSP, DSSANPHAM.TENSP, KHACHHANG.MKH, STOCK.SOLUONG2, SORDER.SOLUONG1
FROM KHACHHANG INNER JOIN (DSSANPHAM INNER JOIN (SORDER LEFT JOIN STOCK ON SORDER.MSP = STOCK.MSP) ON DSSANPHAM.MASP = SORDER.MSP) ON KHACHHANG.MASP = SORDER.MSP
 
Lần chỉnh sửa cuối:
Dạ OT xin cảm ơn Bác VetMini và Anh ongke0711 đã góp ý và chỉ dẫn ạ.

Liên quan đến truy vấn dạng dữ liệu kiểu nhập,xuất, tồn từ SQL... OT sẽ gửi dữ liệu cụ thể nên sau.. đây cũng là một vấn đề OT đang rất quan tâm mà chưa giải quyết và đề cập đến được ạ.
Rất mong khi đó được Bác và Anh cùng mọi người giúp đỡ ạ.
 
Tôi có nói rõ là nó rất rắc rối. Không thể tư vấn theo kiểu diễn đàn được. Bắt buộc phải ăn dầm nằm dề tại kho mà quan sát từng công việc.
Việc cốt kiếc này nọ là chuyện tay trái của tôi cho nên tôi có thể sẵn sàng làm.
Nhưng thiết kế CSDL cho Inventory Control thì tôi không sẵn sàng. Không phải tôi giấu nghề, nhưng tư vấn mà không biết rõ quy trình và không chủ động được quy trình thì tôi từ chối.
Tôi không hề mắc cở khi có ngừoi nói "thằng VM viết code rác rưởi này à?".
Nhưng tôi không chấp nhận một ngày nào đó, có người nói "thằng VM thiết kế cái CSDL rác rưởi này à?"

(*) chủ động quy trình có nghĩa là nếu tôi nói "làm như thế này mới đúng" thì cơ quan phải làm như thế; không có chuyện "nhưng mà..."
 
Tôi có nói rõ là nó rất rắc rối. Không thể tư vấn theo kiểu diễn đàn được. Bắt buộc phải ăn dầm nằm dề tại kho mà quan sát từng công việc.
Việc cốt kiếc này nọ là chuyện tay trái của tôi cho nên tôi có thể sẵn sàng làm.
Nhưng thiết kế CSDL cho Inventory Control thì tôi không sẵn sàng. Không phải tôi giấu nghề, nhưng tư vấn mà không biết rõ quy trình và không chủ động được quy trình thì tôi từ chối.
Tôi không hề mắc cở khi có ngừoi nói "thằng VM viết code rác rưởi này à?".
Nhưng tôi không chấp nhận một ngày nào đó, có người nói "thằng VM thiết kế cái CSDL rác rưởi này à?"

(*) chủ động quy trình có nghĩa là nếu tôi nói "làm như thế này mới đúng" thì cơ quan phải làm như thế; không có chuyện "nhưng mà..."
Con cảm ơn Bác VetMini nhiều ạ.
Thực ra CSDL, khi cài đặt phần mềm đã có tại Server rồi Bác ạ. Nên khâu thiết kế là không cần nữa Bác ạ.
Nhưng phần mềm mới chỉ quản lý nhật ký xuất, nhập hàng ngày và tồn theo tại thời điểm hiện tại, tồn kho đầu kỳ. Không thể lấy được tồn kho theo từng thời điểm.

Ví dụ hiện đang là thời điểm ngày 5/8 trong hệ thống csdl chỉ quản lý tồn kho đầu kỳ sau kiểm kê hết ngày 31/7 và tồn ở thời điểm hiện tại là ở ngày 5/8 là số lượng cụ thể bao nhiêu.

Nhưng khi đứng ở ngày 5/8 nếu con muốn biết dữ liệu tồn kho từ 1/7 đến ngày 25/7 của mã hàng A là bao nhiêu thì hệ thống không có.
Do đó con muốn sử dụng câu truy vấn trong sql để làm việc này.
Về dữ liệu cụ thể, con sẽ cung cấp sau ạ, vì hiện con cũng đang chưa hiểu dữ liệu ở các bảng trong sql liên quan như thêa nào để gửi lên ạ.
OT cảm ơn Bác VetMini và Anh ongke0711 đã quan tâm và giúp đỡ ạ.
 
Web KT
Back
Top Bottom