PDA

View Full Version : Xin giúp về bài tập SQL



phanduy2691
26-03-2011, 18:59
Mình có cái đề như vầy nè:
KHACHHANG (MAKH, HOTEN, DCHI, SODT, NGSINH, DOANHSO, NGDK)
NHANVIEN (MANV,HOTEN, NGVL, SODT)
SANPHAM (MASP,TENSP, DVT, NUOCSX, GIA)
HOADON (SOHD, NGHD, MAKH, MANV, TRIGIA)
CTHD (SOHD,MASP,SL)
Câu hỏi:
1-In số hóa đơn trong năm 2006 đã mua ít nhất tất cả các sản phẩm do Singapore
san xuat
2-Trong 10 danh sách có doanh số cao nhất ,tìm khách hàng có số lần mua hàng nhiều nhất

megaownage
28-03-2011, 09:11
SQL là ngôn ngữ dựa vào đại số nhóm. Cho nên cách làm của nó rất toán.

Phân tích ra từ từ:

- tìm con số SP do Singapore sản xuất (group by, count) -> sub1
- phân biệt các SP thuộc về chung một hóa đơn -> sub2
- trong sub2, dếm số SP liên quan đến Singapore -> sub3
- nếu sub1 = sub3, in ra hóa đơn.

Sau khi có lô gíc rồi thì trải rộng ra (flatten) và viết lại thành query.
Thử query chạy tốt rồi thì chỉnh lại cho đẹp và dễ hiểu.

(Giải pháp trên đặt trên giả thuyết là CSDL chuẩn. Mỗi món hàng trong hóa đơn là đặc chủng - tất cả các món hàng cùng một hóa đơn phải khác nhau)

Muốn tìm 10 kh có doanh số liên hệ cao nhất thì chịu khó lục pho rum. Đã có bài viết rất đầy đủ về cái này. Bài rất dài, cộng phân tích của những người nhiều kinh nghiệm. Những người mới học SQL nên đọc qua.

chip07
28-03-2011, 13:14
--Mình có cái đề như vầy nè:
--KHACHHANG (MAKH, HOTEN, DCHI, SODT, NGSINH, DOANHSO, NGDK)
--NHANVIEN (MANV,HOTEN, NGVL, SODT)
--SANPHAM (MASP,TENSP, DVT, NUOCSX, GIA)
--HOADON (SOHD, NGHD, MAKH, MANV, TRIGIA)
--CTHD (SOHD,MASP,SL)
--Câu hỏi:

--1-In số hóa đơn trong năm 2006 đã mua ít nhất tất cả các sản phẩm do Singapore san xuat

SELECT hd.SoHD, hd.NgayHD, hd.MaKH, hd.MaNV, hd.TriGia
FROM tblHoaDon hd
INNER JOIN tblCTHoaDon cthd ON (hd.SoHD = cthd.SoHD)
INNER JOIN tblSanPham sp ON (cthd.MaSP = sp.MaSP)
WHERE (DATEPART(YEAR,hd.Ngay) = 2006)
AND (sp.NuocSX = 'Singapore')

--2-Trong 10 danh sách có doanh số cao nhất ,tìm khách hàng có số lần mua hàng nhiều nhất

SELECT TOP 1 kh.MaKH AS MaKH, kh.HoTen, kh.DiaChi, kh.SoDT, kh.NgaySinh, kh.DoanhSo, kh.NgayDK, top10.SoLanMua, top10.DoanhSo AS TongDoanhSo
FROM
(
SELECT TOP 10 hd.MaKH AS MaKH, SUM(hd.TriGia) AS DoanhSo, COUNT(hd.SoHD) AS SoLanMua
FROM tblHoaDon hd
INNER JOIN tblCTHoaDon cthd ON (hd.SoHD = cthd.SoHD)
GROUP BY hd.MaKH
ORDER BY DoanhSo DESC
) top10
INNER JOIN tblKhachHang kh ON (top10.MaKH = kh.MaKH)
ORDER BY top10.SoLanMua DESC

phanduy2691
28-03-2011, 23:27
me day la fai bik cam on cac pac