Giải bài tập thực hành truy vấn cơ sở dữ liệu quản lý bán hàng
1. Tóm tắt đề bài CSDL Quản lí bán hàng
KHACHHANG (MAKH, HOTEN, DCHI, SODT, NGSINH, DOANHSO, NGDK)
Tân từ: Quan hệ khách hàng sẽ lưu trữ thông tin của khách hàng thành viên gồm có các thuộc tính: mã khách hàng, họ tên, địa chỉ, số điện thoại, ngày sinh, ngày đăng ký và doanh số (tổng trị giá các hóa đơn của khách hàng thành viên này).
NHANVIEN (MANV,HOTEN, NGVL, SODT)
Tân từ: Mỗi nhân viên bán hàng cần ghi nhận họ tên, ngày vào làm, điện thọai liên lạc, mỗi nhân viên phân biệt với nhau bằng mã nhân viên.
SANPHAM (MASP,TENSP, DVT, NUOCSX, GIA)
Tân từ: Mỗi sản phẩm có một mã số, một tên gọi, đơn vị tính, nước sản xuất và một giá bán.
HOADON (SOHD, NGHD, MAKH, MANV, TRIGIA)
Tân từ: Khi mua hàng, mỗi khách hàng sẽ nhận một hóa đơn tính tiền, trong đó sẽ có số hóa đơn, ngày mua, nhân viên nào bán hàng, trị giá của hóa đơn là bao nhiêu và mã số của khách hàng nếu là khách hàng thành viên.
CTHD (SOHD,MASP,SL)
Đề bài ở phần trước https://kienthuc24h.com/csdl-bt-thuc-hanh-1-truy-van-sql/
2. Lời giải BT Truy vấn CSDL Quản lí bán hàng
11. Tìm các số hóa đơn đã mua sản phẩm có mã số “BB01” hoặc “BB02”.
SELECT distinct hd.SOHD FROM HOADON hd, CTHD ct WHERE hd.SOHD = ct.SOHD AND ct.MASP IN ('BB01','BB02')
12. Tìm các số hóa đơn đã mua sản phẩm có mã số “BB01” hoặc “BB02”, mỗi sản phẩm mua với số lượng từ 10 đến 20.
SELECT distinct hd.SOHD FROM HOADON hd, CTHD ct WHERE hd.SOHD = ct.SOHD AND ct.MASP IN ('BB01','BB02') AND ct.SL BETWEEN 10 AND 20
Tuy nhiên lời giải trên khá thừa, vì chỉ hỏi mã hóa đơn, trên thực tế không cần thiết kết bảng HOADON và CTHD trừ khi cần khai thác thêm thông tin của HOADON như vậy có thể sửa tối ưu cho câu này như sau:
SELECT distinct ct.SOHD FROM CTHD ct WHERE ct.MASP IN ('BB01','BB02') AND ct.SL BETWEEN 10 AND 20
13. Tìm các số hóa đơn mua cùng lúc 2 sản phẩm có mã số “BB01” và “BB02”, mỗi sản phẩm mua với số lượng từ 10 đến 20.
SELECT distinct hd.SOHD FROM HOADON hd, CTHD ct WHERE hd.SOHD = ct.SOHD AND ct.MASP='BB01' AND ct.SL BETWEEN 10 AND 20 INTERSECT SELECT distinct hd.SOHD FROM HOADON hd, CTHD ct WHERE hd.SOHD = ct.SOHD AND ct.MASP = 'BB02' AND ct.SL BETWEEN 10 AND 20
14. In ra danh sách các sản phẩm (MASP,TENSP) do “Trung Quoc” sản xuất và được bán ra trong ngày 1/1/2007.
SELECT sp.MASP, sp.TENSP FROM SANPHAM sp, HOADON hd, CTHD ct WHERE sp.NUOCSX='Trung Quoc' AND hd.NGHD='1/1/2007' AND hd.SOHD = ct.SOHD and sp.MASP=ct.MASP
15. In ra danh sách các sản phẩm (MASP,TENSP) không bán được.
Sử dụng NOT IN
SELECT sp.MASP,sp.TENSP FROM SANPHAM sp WHERE sp.MASP NOT IN ( SELECT ct.MASP FROM CTHD ct )
Sử dụng NOT EXISTS
SELECT sp.MASP,sp.TENSP FROM SANPHAM sp WHERE not exists ( SELECT ct.MASP FROM CTHD ct WHERE sp.MASP=ct.MASP)
16. In ra danh sách các sản phẩm (MASP,TENSP) không bán được trong năm 2006.
Sử dụng NOT IN
SELECT sp.MASP,sp.TENSP FROM SANPHAM sp WHERE sp.MASP not in ( SELECT ct.MASP FROM HOADON hd, CTHD ct WHERE hd.SOHD = ct.SOHD AND YEAR(hd.NGHD)=2006)
Sử dụng EXISTS
SELECT sp.MASP,sp.TENSP FROM SANPHAM sp WHERE not exists ( SELECT ct.MASP FROM CTHD ct, HOADON hd WHERE HD.SOHD=CT.SOHD AND sp.MASP=ct.MASP AND YEAR(hd.NGHD)=2006)
Sử dụng EXCEPT
SELECT MASP, TENSP FROM SANPHAM EXCEPT SELECT distinct sp.MASP, sp.TENSP FROM CTHD ct, HOADON hd, SANPHAM sp WHERE ct.SOHD = hd.SOHD AND ct.MASP = sp.MASP AND year(hd.NGHD)=2006
17. In ra danh sách các sản phẩm (MASP,TENSP) do “Trung Quoc” sản xuất không bán được trong năm 2006.
Sử dụng EXCEPT
SELECT MASP, TENSP FROM SANPHAM WHERE NUOCSX='Trung Quoc' EXCEPT SELECT distinct sp.MASP, sp.TENSP FROM HOADON hd, CTHD ct, SANPHAM sp WHERE year(hd.NGHD)=2006 and hd.SOHD=ct.SOHD and sp.MASP = ct.MASP
18. Tìm số hóa đơn đã mua tất cả các sản phẩm do Singapore sản xuất.
SELECT SOHD FROM HOADON WHERE NOT EXISTS ( SELECT * FROM SANPHAM WHERE NUOCSX= 'Singapore' AND MASP NOT IN ( SELECT masp FROM CTHD WHERE SOHD = HOADON.SOHD and CTHD.MASP = SANPHAM.MASP ) )
19. Tìm số hóa đơn trong năm 2006 đã mua ít nhất tất cả các sản phẩm do Singapore sản xuất.
SELECT SOHD FROM HOADON WHERE year(NGHD)=2006 and NOT EXISTS ( SELECT * FROM SANPHAM WHERE NUOCSX = 'Singapore' and MASP NOT IN ( SELECT masp FROM CTHD WHERE SOHD = HOADON.SOHD ) )
20. Có bao nhiêu hóa đơn không phải của khách hàng đăng ký thành viên mua?
SELECT count(SOHD) as SL FROM HOADON WHERE MAKH is null
21. Có bao nhiêu sản phẩm khác nhau được bán ra trong năm 2006.
SELECT count(distinct ct.MASP) FROM HOADON hd, CTHD ct WHERE YEAR(hd.NGHD) = 2006 and ct.SOHD=hd.SOHD
22. Cho biết trị giá hóa đơn cao nhất, thấp nhất là bao nhiêu ?
SELECT MAX(HOADON.TRIGIA), MIN(HOADON.TRIGIA) FROM HOADON
23. Trị giá trung bình của tất cả các hóa đơn được bán ra trong năm 2006 là bao nhiêu?
SELECT AVG(hd.TRIGIA) FROM HOADON hd WHERE YEAR(hd.NGHD) = 2006
24. Tính doanh thu bán hàng trong năm 2006.
SELECT sum(hd.TRIGIA) FROM HOADON hd WHERE YEAR(hd.NGHD) = 2006
25. Tìm số hóa đơn có trị giá cao nhất trong năm 2006.
SELECT SOHD FROM HOADON WHERE TRIGIA IN ( SELECT max(hd.TRIGIA) FROM HOADON hd WHERE YEAR(hd.NGHD) = 2006 )
26. Tìm họ tên khách hàng đã mua hóa đơn có trị giá cao nhất trong năm 2006.
SELECT kh.HOTEN FROM KHACHHANG kh, HOADON WHERE HOADON.MAKH=KH.MAKH AND HOADON.TRIGIA in ( SELECT MAX(hd.TRIGIA) FROM HOADON hd WHERE year(hd.NGHD)=2006 )
Hoặc
SELECT HOTEN FROM KHACHHANG kh, HOADON WHERE HOADON.MAKH = kh.MAKH and HOADON.TRIGIA >=ALL ( SELECT max(hd.TRIGIA) FROM HOADON hd WHERE year(hd.NGHD)=2006 )
27. In ra danh sách 3 khách hàng (MAKH, HOTEN) có doanh số cao nhất.
SELECT top 3 MAKH, HOTEN FROM KHACHHANG order by DOANHSO desc
28. In ra danh sách các sản phẩm (MASP, TENSP) có giá bán bằng 1 trong 3 mức giá cao nhất.
SELECT MASP, TENSP FROM SANPHAM WHERE GIA IN ( SELECT DISTINCT TOP 3 sp.GIA FROM SANPHAM sp ORDER BY sp.GIA DESC )
29. In ra danh sách các sản phẩm (MASP, TENSP) do “Thai Lan” sản xuất có giá bằng 1 trong 3 mức giá cao nhất (của tất cả các sản phẩm).
SELECT SANPHAM.MASP, SANPHAM.TENSP FROM SANPHAM WHERE SANPHAM.NUOCSX='Thai Lan' AND SANPHAM.GIA IN ( SELECT DISTINCT TOP 3 sp.GIA FROM SANPHAM sp ORDER BY sp.GIA DESC )
30. In ra danh sách các sản phẩm (MASP, TENSP) do “Trung Quoc” sản xuất có giá bằng 1 trong 3 mức giá cao nhất (của sản phẩm do “Trung Quoc” sản xuất).
SELECT SANPHAM.MASP, SANPHAM.TENSP FROM SANPHAM WHERE SANPHAM.NUOCSX='Trung Quoc' AND SANPHAM.GIA IN ( SELECT DISTINCT TOP 3 sp.GIA FROM SANPHAM sp WHERE sp.NUOCSX = 'Trung Quoc' ORDER BY sp.GIA DESC )
31. * In ra danh sách 3 khách hàng có doanh số cao nhất (sắp xếp theo kiểu xếp hạng).
SELECT TOP 3 RANK() OVER (order by kh.DOANHSO DESC) ThuHang, * FROM KHACHHANG kh ORDER BY kh.DOANHSO DESC
32. Tính tổng số sản phẩm do “Trung Quoc” sản xuất.
SELECT COUNT(MASP) FROM SANPHAM WHERE NUOCSX='Trung Quoc'
33. Tính tổng số sản phẩm của từng nước sản xuất.
SELECT NUOCSX, COUNT(MASP) FROM SANPHAM GROUP BY NUOCSX
34. Với từng nước sản xuất, tìm giá bán cao nhất, thấp nhất, trung bình của các sản phẩm.
SELECT MAX(GIA) CaoNhat, MIN(GIA) ThapNhat, AVG(GIA) TrungBinh FROM SANPHAM GROUP BY NUOCSX
35. Tính doanh thu bán hàng mỗi ngày.
SELECT NGHD, SUM(TRIGIA) DoanhThu FROM HOADON GROUP BY NGHD
36. Tính tổng số lượng của từng sản phẩm bán ra trong tháng 10/2006.
SELECT ct.MASP, sum(ct.SL) FROM CTHD ct, HOADON hd WHERE ct.SOHD=hd.SOHD AND month(NGHD)=10 AND year(NGHD)=2006 GROUP BY ct.MASP
37. Tính doanh thu bán hàng của từng tháng trong năm 2006.
SELECT month(hd.NGHD) Thang , sum(hd.TRIGIA) Tong FROM HOADON hd WHERE year(hd.NGHD)=2006 GROUP BY month(hd.NGHD)
38. Tìm hóa đơn có mua ít nhất 4 sản phẩm khác nhau.
SELECT * FROM HOADON WHERE SOHD in ( SELECT HD.SOHD FROM ( SELECT ct.sohd, COUNT(CT.MASP) SL FROM CTHD ct GROUP BY CT.SOHD) HD WHERE HD.SL>=4 )
Sử dụng HAVING
SELECT SOHD, COUNT(MASP) FROM CTHD GROUP BY SOHD HAVING COUNT(MASP)>=4
39. Tìm hóa đơn có mua 3 sản phẩm do “Viet Nam” sản xuất (3 sản phẩm khác nhau).
SELECT ct.SOHD, count(CT.MASP) FROM CTHD ct, SANPHAM sp WHERE ct.MASP = sp.MASP AND sp.NUOCSX='Viet Nam' GROUP BY ct.SOHD HAVING count(ct.masp)>=3
40. Tìm khách hàng (MAKH, HOTEN) có số lần mua hàng nhiều nhất.
SELECT TOP 1 HOADON.MAKH, KH.HOTEN FROM HOADON, KHACHHANG kh WHERE HOADON.MAKH is not null and HOADON.MAKH = KH.MAKH GROUP BY HOADON.MAKH, KH.HOTEN ORDER BY count(HOADON.MAKH) DESC
Cách khác
select makh, count(SOHD) from hoadon where makh is not null group by makh having count(SOHD)=( select max(a.slmh) from (select makh,count(sohd) slmh from hoadon where makh is not null group by makh) a )
Cách khác
select makh, count(sohd) from hoadon where makh is not null group by makh having count(sohd) >= all( select count(sohd) slmh from hoadon where makh is not null group by makh)
41. Tháng mấy trong năm 2006, doanh số bán hàng cao nhất ?
SELECT MONTH(hd2.NGHD) FROM HOADON hd2 WHERE year(hd2.NGHD)=2006 GROUP BY MONTH(hd2.NGHD) HAVING SUM(hd2.TRIGIA)>=ALL ( SELECT sum(hd.TRIGIA) FROM HOADON hd WHERE year(hd.NGHD) = 2006 GROUP BY month(hd.NGHD) )
42. Tìm sản phẩm (MASP, TENSP) có tổng số lượng bán ra thấp nhất trong năm 2006.
SELECT ct1.MASP, sp.TENSP FROM CTHD ct1, HOADON hd1, SANPHAM sp WHERE ct1.SOHD = hd1.SOHD AND year(hd1.NGHD)=2006 and sp.MASP = ct1.MASP GROUP BY ct1.MASP, sp.TENSP HAVING sum(ct1.SL) <= ALL ( SELECT sum(ct.SL) FROM CTHD ct, HOADON hd WHERE ct.SOHD = hd.SOHD AND year(hd.NGHD)=2006 GROUP BY ct.MASP )
43. *Mỗi nước sản xuất, tìm sản phẩm (MASP,TENSP) có giá bán cao nhất.
SELECT sp1.NUOCSX, sp1.MASP, sp1.TENSP FROM SANPHAM sp1, (SELECT sp.NUOCSX, max(sp.GIA) giamax FROM SANPHAM sp GROUP BY sp.NUOCSX) gia_QG WHERE sp1.NUOCSX = gia_QG.NUOCSX and sp1.GIA=gia_QG.giamax
Cách khác
SELECT sp1.NUOCSX, sp1.MASP, sp1.TENSP FROM SANPHAM sp1 WHERE sp1.GIA in ( SELECT max(sp.GIA) FROM SANPHAM sp WHERE sp1.NUOCSX = sp.NUOCSX )
44. Tìm nước sản xuất ít nhất 3 sản phẩm có giá bán khác nhau.
SELECT sp1.NUOCSX FROM SANPHAM sp1, ( SELECT sp.NUOCSX, sp.GIA, count(sp.MASP) SL FROM SANPHAM sp GROUP BY sp.NUOCSX, sp.GIA ) groupgia WHERE groupgia.NUOCSX = SP1.NUOCSX AND groupgia.GIA = sp1.GIA group by sp1.NUOCSX HAVING count(groupgia.SL)>=3
Hoặc
SELECT sp.NUOCSX FROM SANPHAM sp GROUP BY sp.NUOCSX HAVING count(distinct sp.GIA)>=3
45. *Trong 10 khách hàng có doanh số cao nhất, tìm khách hàng có số lần mua hàng nhiều nhất.
SELECT hd1.MAKH, DS1.HOTEN FROM ( SELECT TOP 10 kh1.MAKH, KH1.HOTEN FROM KHACHHANG kh1 WHERE kh1.MAKH is not null ORDER BY kh1.DOANHSO DESC ) DS1, HOADON hd1 WHERE DS1.MAKH = hd1.MAKH GROUP BY hd1.MAKH, DS1.HOTEN HAVING COUNT(HD1.SOHD)>= ALL( SELECT count(hd.SOHD) FROM ( SELECT TOP 10 kh.MAKH FROM KHACHHANG kh WHERE kh.MAKH is not null ORDER BY kh.DOANHSO DESC ) DS, HOADON hd WHERE DS.MAKH = hd.MAKH GROUP BY hd.MAKH )
Bạn có thế giải thích cho mình câu số 19 không ạ?
Mình không hiểu nó hoạt động như thế nào
Chào bạn,
Đầu tiên để xác định hóa đơn nào vào năm 2006 mua tất cả sản phẩm do sing sản xuất thì bạn đưa về hướng giải quyết như sau:
– Tìm những sản phẩm của Sing mà hóa đơn HD001 chưa mua (Ban đầu mình sẽ giả sử đối tượng xét tới là HD001 nhé)
+ Đầu tiên tìm những sản phẩm mà hóa đơn HD001 đã mua là:
Tiếp theo, những “sản phẩm của Sing sản xuất mà HD001 chưa mua” sẽ là những sản phẩm ko nằm trong tập bên trên, nên ta có:
Như vậy, Bây giờ mình chỉ cần xác định HD001 có sản phẩm nào của Sing mà nó chưa mua không? Và là năm 2006 chứ?
Có nghĩa là nếu tồn tại trong đoạn select ở trên thì nó không thỏa, do tồn tại sản phẩm của Sing mà nó chưa mua.
Sau khi bạn đã xác định được trên HD001 thì bạn mở rộng ra nhiều hóa đơn bằng cách thay HD001 thành HOADON.SOHD
Xin chào các bạn,
Mình thấy câu 18 hơi khó hiểu, các bạn có thể giúp mình giải nghĩa bằng lời logic suy luận của nó được không?
18. Tìm số hóa đơn đã mua tất cả các sản phẩm do Singapore sản xuất.
SELECT SOHD
FROM HOADON
WHERE
NOT EXISTS
(
SELECT *
FROM SANPHAM
WHERE NUOCSX= ‘Singapore’ AND MASP NOT IN
(
SELECT masp
FROM CTHD
WHERE SOHD = HOADON.SOHD and CTHD.MASP = SANPHAM.MASP
)
)
anh có thể cho em hỏi : để tìm được Nước có tổng số sản phẩm là lớn nhất thì làm như thế nào ạ ?
Để tìm nước có nhiều sản phẩm nhất em có thể Group by theo Mã nước, sau đó dùng Count(MASP) để đếm nhé.
SELECT NUOCSX, Count(MASP)
FROM SANPHAM
GROUP BY NUOCSX
Lúc này em sẽ được 1 bảng chứa danh sách số sản phẩm của các nước.
Em có thể sắp xếp lại để lấy kết quả nhé.
SELECT TOP 1 NUOCSX, Count(MASP) SoLuong
FROM SANPHAM
GROUP BY NUOCSX
ORDER BY count(MASP) DESC
Tuy nhiên cách trên chỉ lấy được 1 nước duy nhất có số sản phẩm nhiều nhất thôi, còn trường hợp nhiều nước có số lượng sản phẩm giống nhau mà lại lớn nhất thì em có thể dùng truy vấn lồng để lấy nhé.
SELECT NuocSX, Count(MaSP) FROM SanPham
WHERE(SELECT MAX(COUNT(MaSP)) FROM SanPham)
Group By NuocSX ;
truy vấn lồng thế này đúng chưa anh ?
Cho mình hỏi muốn tính số lượng đã bán tưng ứng của từng mặt hàng ta lam sau vay?
Cho mình hỏi muốn tính số lượng đã bán tưng ứng của từng mặt hàng ta lam sau vay?
3. Đưa ra số lượng đã bán tương ứng của từng mặt hàng.
SELECT MAHANG*
FROM TENHANG, SOHD
WHERETENHANG.MAH= SOHD.MAH
GROUP BY MAH
À ko nó phải là WHERE COUNT(MaSP)=(SELECT MAX(COUNT(MaSP)) FROM SanPham) đúng ko ạ ?
Bình luận trước đó em gửi anh nghĩ là lỗi cú pháp á.
Anh nghĩ nếu dùng truy vấn lồng thì em có thể viết như thế này nhé
Chúc em học tốt.
em cảm ơn anh ạ
SELECT sp.MASP,sp.TENSP
FROM SANPHAM sp
WHERE not exists ( SELECT ct.MASP FROM CTHD ct, HOADON hd WHERE sp.MASP=ct.MASP AND YEAR(hd.NGHD)=2006)
AI GIẢI THÍCH CHO MÌNH CHỖ NÀY ĐƯỢC KHÔNG.TẠI WHERE LẦN 2 ẤY SAO KHÔNG CÓ HD.SOHD=CT.SOHD
Bạn đang nói đến câu 16 phải không?
Mình vừa kiểm tra lại, chính xác là thiếu HD.SOHD = CT.SOHD.
Mình đã cập nhật lại đáp án câu 16.
Cảm ơn bạn đã góp ý.
AD cho em hỏi với ạ
Em truy vấn như này thì sai chỗ nào ạ?
SELECT SP.MASP,SP.TENSP
FROM SANPHAM SP,HOADON HD,CTHD CT
WHERE(SP.MASP=CT.MASP AND CT.SOHD=HD.SOHD AND YEAR(HD.NGHD)!=2006)
1. Đưa ra danh sách mặt hàng được bán trong tháng 9 năm 2021
2. Đưa ra danh sách khách hàng có địa chỉ ở Thái Nguyên và từng mua hàng trong tháng 9 năm 2021
3. Đưa ra số lượng đã bán tương ứng của từng mặt hàng.
các a giup minh duoc ko ạ minh gui cù lao cho 0919844599
1. Đưa ra danh sách mặt hàng được bán trong tháng 9 năm 2021
SELECT COUNT (DISIINCT MAH)
FROM CTHD C INNER JOIN HOADONHANG
WHERE C. SOHD= H. SOHDON
AND MONTH(NGAYBD)= ‘9’ AND YEAR (NGAYBD)= ‘2021’
2. Đưa ra danh sách khách hàng có địa chỉ ở Thái Nguyên và từng mua hàng trong tháng 9 năm 2021
SELECT KHACHHANG*
FROM KHACHHANG, HDHANG, DIACHI
WHERE KHACHHANG.MAK= SHDON.MAK
AND DIACHI.MAH = HANG.MAH
AND KHACHHANG. DIACHI= ‘THAINGUYEN’
AND MONTH(NGAYBD)=’9’ AND YEAR(NGAYBD)= ‘2021’
3. Đưa ra số lượng đã bán tương ứng của từng mặt hàng.
SELECT COUNT(MAH) SOLUONG
FROM TENHANG, SOHD
WHERE TENHANG.MAH= SOHD.MAH
GROUP BY MAH
bạn ơi giải thích câu 18 được không.mình không hiểu nó hoạt động thế nào, mình có đọc 1 số tài liệu mà vẫn không hiểu cơ chế hoạt động của phép lồng tương quan thế nào.mình cảm ơn
Câu này có cách làm tương tự câu 19, mình có giải thích ở bình luận bạn xem thử nha https://kienthuc24h.com/csdl-bt-thuc-hanh-1-truy-van-sql-phan-2/#comment-2978
cho em hỏi câu 14 phải là và chứ ạ còn hoặc thì ra nhiều đáp án lắm
Câu 14 anh đã sửa lại đề bài cho hợp lý. Cảm ơn em
ANH ƠI XEM LẠI CÂU 18 HỘ E VS Ạ , CÓ 2 SẢN PHẨM SINGAPOR BÁN RA TỪ HÓA ĐƠN 1001 VÀ 1014 , MÀ TRUY VẪN NHƯ TRÊN ĐÁP ÁN CHỈ RA 1001 THÔI A
Hi em, HĐ 1014 không mua sản phẩm BC01 của Singapore nên đáp án chỉ có HD 1001 thôi.
AD cho em hỏi câu 16 ạ.
Em viết câu truy vấn như này:
SELECT SP.MASP,SP.TENSP
FROM SANPHAM SP,HOADON HD,CTHD CT
WHERE(SP.MASP=CT.MASP AND CT.SOHD=HD.SOHD AND YEAR(HD.NGHD)!=2006)
Thì sai chỗ nào ạ?
Em cảm ơn!
Hi em,
Em viết vậy sai là vì em đang chọn những sản phẩm không được bán ra trong năm 2006, điều đó có nghĩa là nó truy vấn ra những “sản phẩm đã mua ở năm 2005, 2004,….”.
Nên để hiểu đúng ý đề bài là hiển thị những sản phẩm không được bán trong năm 2006 thì em cần xác định những sản phẩm đã được mua ở năm này, và những sản phẩm không thuộc danh sách đã được mua chính là kết quả bài toán.
Chúc em học tốt.
Mọi người cho mình hỏi câu 12 tại sao không lấy SOHD ở bảng CTHD mà phải lấy SOHD ở bảng HOADON?
SELECT DISTINCT CT.SOHD
FROM CTHD CT
WHERE CT.MASP IN (‘BB01’, ‘BB02’)
AND SL BETWEEN 10 AND 20
Hi bạn, bạn hỏi làm mình bó tay luôn :’) Phần này lấy số HD ở HoaDon hay ở CTHD cũng như nhau nha bạn. Ở code mình làm ở trên mình có điều kiện hd.SOHD = ct.SOHD dùng để kết 2 bảng này lại nên 2 cái sohd này như nhau nha bạn. Tuy nhiên code của bạn có vẻ như bỏ quên phần “hd.SOHD = ct.SOHD”.
Bạn tham khảo lại nha, chúc bạn học tốt.
Vì tại em mới học môn này nên còn ngơ ngơ anh ạ, hóa ra là nó như nhau :)) Còn code của em em chỉ lấy SOHD ở CTHD thì điều kiện “hd.SOHD = ct.SOHD” này để làm gì đâu anh?
à ừa nhỉ. Câu này đúng là không cần kết 2 bảng HoaDon với CTHD. Chỉ kết khi khai thác thêm thông tin của HD đó ví dụ như thêm 1 điều kiện nữa là mua trong năm 2006 chẳng hạn thì cần. 😀
Hi a, anh cho em hỏi B18 sao em làm như bên dưới không ra thế ạ?
Với, như cách là của B18 ở trên thì cái querry to nhất kiểu khai báo bảng HOADON r thì những cái subquerry có thể tự hiểu được ạ? Lúc e thêm bảng HOADON vào subquerry thì kết quả trả ra nhiều số hóa đơn, nên em k hiểu ra lúc add thêm bảng bên dưới thì nó chạy như nào, lại kiểu chạy duyệt lại 1 lần nữa cái bảng hóa đơn ạ?
Anh xem giúp em với ạ, mãi k ra :((
SELECT SOHD
FROM HOADON
WHERE
NOT EXISTS
(SELECT *
FROM CTHD CT, SANPHAM SP
WHERE SOHD=CT.SOHD AND ct.MASP=sp.masp and SP.NUOCSX not in (‘Singapore’))
Em nghĩ là bài 18, 19 nên làm theo kiểu group by thì dễ hiểu hơn :3
Bài 19:
–Tạo bảng tạm–
SELECT CTHD.SOHD, SANPHAM.MASP, NUOCSX INTO BANGTAM2
FROM SANPHAM, CTHD, HOADON
WHERE SANPHAM.MASP=CTHD.MASP AND CTHD.SOHD= HOADON.SOHD AND YEAR(HOADON.NGHD)=’2006′
–Tìm số sản phẩm được sản xuất tại Singapore của mỗi hóa đơn và so sánh với số sp được sx ở Sing–
SELECT SOHD
FROM BANGTAM2
GROUP BY SOHD, NUOCSX
HAVING NUOCSX=’SINGAPORE’ AND COUNT(MASP) IN
(SELECT COUNT(NUOCSX)
FROM SANPHAM
WHERE NUOCSX=’SINGAPORE’)
Câu 14: MÌnh đâu cần lấy thêm bảng CTHD đâu anh. Em chưa hiểu chỗ Anh lấy thêm bảng CTHD.
SELECT s.MASP, s.TENSP, NGHD
FROM dbo.SANPHAM s , dbo.HOADON
WHERE s.NUOCSX =’Trung Quoc’ AND dbo.HOADON.NGHD=’1/1/2007′
Em chưa có điều kiện kết giữa 2 bảng, em xem lại nha. Từ hóa đơn, mình tìm dc chi tiết, từ chi tiết mình mới biết sản phẩm mua là gì chứ nhỉ?
Ok tks anh rất nhiều ak 😀
chắc là ad học UIT
có thể làm giúp em câu này được không
Trị giá của một hóa đơn là tổng thành tiền (số lượng*đơn giá) của các chi tiết thuộc hóa đơn đó
dùng trigger , RBTV ấy
câu này thuộc phần I câu 14 trong phần quản lý bán hàng , deadline sắp đến nơi mà em làm vẫn không ra
em cảm ơn
Trigger thì không khó, nhưng mà lâu rồi không làm nên anh cũng không nhớ nữa 😀 với lại anh không có đề câu này.
CREATE TRIGGER trg_ins_cthd ON CTHD
FOR INSERT
AS
BEGIN
DECLARE @SoHD int, @MaSP char(4), @SoLg int, @TriGia money — Lay thong tin cua CTHD vua moi them vao
SELECT @SoHD = SOH, @MaSP = MASP, @SoLg = SL
FROM INSERTED
— Tinh tri gia cua san pham moi them vao HOADON
SET @TriGia = @SoLg * SELECT GIA FROM SANPHAM WHERE MASP
— Khai bao mot CURSOR duyet qua tat ca cac CTHD da co sa
DECLARE cur_cthd CURSOR
FOR
SELECT MASP, SL
FROM CTHD
WHERE SOHD = @SoHD
OPEN cur cthd
FETCH NEXT FROM cur_cthd
INTO @MaSP, @SoLg
WHILE (@@FETCH_STATUS = 0)
BEGIN
— Cong don tri gia cua tung san pham vao bien TriGia
SET @TriGia = ©TriGia + @SoLg * SELECT GIA FROM SANPHAM WHERE MASP = @MaSP
FETCH NEXT FROM cur cthd
INTO @MaSP, @SoLg
END
CLOSE cur_cthd CURSOR
DEALLOCATE cur_cthd —Tien hanh cap nhat lai tri gia HOADON
UPDATE HOADON SET TRIGIA = @TriGia WHERE SOHD = @SoHD
END
Câu 45: Làm theo cách sau có được không anh? Em thấy cùng đáp án
SELECT TOP 1 h.MAKH, COUNT(SOHD) AS SLMua
FROM HOADON h
WHERE h.MAKH IN (SELECT TOP 10 k.MAKH
FROM KHACHHANG k
ORDER BY DOANHSO DESC)
GROUP BY h.MAKH
ORDER BY SLMua DESC
Cho em hỏi nếu muốn lọc các dữ liệu mà điều kiện là các khách hàng không có số điện thoại thì phải làm ntn ạ? E cám ơn!
Em dùng điệu kiện IsNull(SODT) nhé. nếu SDT null thì nó true