MÔ HÌNH QUẢN LÝ BÁN HÀNG VÀ CÁC CÂU LỆNH SQL
TABLE KHÁCH HÀNG LÀ CÔNG TY CỦA KHÁCH HÀNG
Cho cơ sở dữ diệu sau được sử dụng để quản lý công tác giao hàng trong một công ty kinh doanh.
trong dó:
• Bảng NHACUNGCAP lưu trữ dữ liệu về các đối tác cung cấp hàng cho công ty.
• Bảng MATHANG lưu trữ dữ liệu về các mặt hàng hiện có trong công ty.
• Bảng LOAIHANG phân loại các mặt hàng hiện có.
• Bảng NHANVIEN có dữ liệu là các thông tin về nhân viên làm việc trong công ty
• Bảng KHACHHANG được sử dụng để lưu trữ các thông tin về khách hàng của công ty.
• Khách hàng đặt hàng cho công ty thông qua các đơn đặt hàng. Thông tin chung về các đơn đặt
hàng được lưu trữ trong bảng DONDATHANG (Mỗi một đơn đặt hàng phải do một nhân viên
của công ty lập và do đó bảng này có quan hệ với bảng NHANVIEN)
• Thông tin chi tiết của các đơn đặt hàng (đặt mua mặt hàng gì, số lượng, giá cả,…) được lưu trữ
trong bảng CHITIETDATHANG, bảng này có quan hệ với hai bảng DONDATHANG và
MAHANG.
*CÂU LỆNH SQL ĐỂ TẠO BẢNG VÀ NHẬP DỮ LIỆU:
CREATE DATABASE QLBH
CREATE TABLE KHACHHANG
(
MaKhachHang INT
CONSTRAINT PK_KHACHHANG_MaKhachHang PRIMARY KEY,
TenCongTy NVARCHAR(50),
TenGiaoDich NVARCHAR(20),
DiaChi NVARCHAR(50),
Email VARCHAR(30),
DienThoai VARCHAR(15),
Fax VARCHAR(15),
)
CREATE TABLE NHACUNGCAP
(
MaCongTy CHAR(3)
ON DELETE CASCADE
ON UPDATE CASCADE,
)
CREATE TABLE NHANVIEN
(
MaNhanVien CHAR(4)
CONSTRAINT PK_NHANVIEN_MaKhachHang PRIMARY KEY,
Ho NVARCHAR(40),
Ten NVARCHAR(10),
NgaySinh DATETIME,
NgayLamViec DATETIME,
DiaChi NVARCHAR(60),
DienThoai VARCHAR(15),
LuongCoBan NUMERIC(10,2),
PhuCap NUMERIC(10,2),
)
CREATE TABLE DONDATHANG
(
SoHoaDon INT
CONSTRAINT PK_DONDATHANG_SoHoaDon PRIMARY KEY,
MaKhachHang INT,
MaNhanVien CHAR(4),
NgayDatHang DATETIME,
NgayGiaoHang DATETIME,
NgayChuyenHang DATETIME,
NoiGiaoHang NVARCHAR(80),
CONSTRAINT FK_DONDATHANG_MaKhachHang FOREIGN KEY(MaKhachHang)
REFERENCES KHACHHANG(MaKhachHang)
ON DELETE CASCADE
ON UPDATE CASCADE,
INSERT INTO KHACHHANG VALUES(2, N'Công ty may mặc Việt Tiến', 'VIETTIEN', N'Sài Gòn',
'','08-808803','');
INSERT INTO KHACHHANG VALUES(3, N'Tổng công ty thực phẩm dinh dưỡng NUTRIFOOD',
'NUTRIFOOD', N'Sài Gòn', '','08-809890','');
INSERT INTO KHACHHANG VALUES(4, N'Công ty điện máy Hà Nội', 'MACHANOI', N'Hà Nội',
'','04-898399','');
INSERT INTO KHACHHANG VALUES(5, N'Hãng hàng không Việt Nam','VIETNAMAIRLINES',N'Sài
Gòn','','08-888888','');
INSERT INTO KHACHHANG VALUES(6, N'Công ty dụng cụ học sinh MIC','MIC', N'Hà
Nội','','04-804408','');
INSERT INTO NHANVIEN VALUES('A001', N'Đậu Tố', N'Anh', '03/07/1986','03/01/2009', N'Quy
Nhơn', '056-647995', 10000000, 1000000);
INSERT INTO NHANVIEN VALUES('H001', N'Lê Thị Bích', N'Hoa', '05/20/1986','03/01/2009', N'An
Khê', '', 9000000, 1000000);
INSERT INTO NHANVIEN VALUES('H002', N'Ông Hoàng', N'Hải', '08/11/1987','03/01/2009', N'Đà
Nẵng', '0905-611725', 12000000, 0);
INSERT INTO NHANVIEN VALUES('H003', N'Trần Nguyễn Đức', N'Hoàng', '04/09/1986','03/01/2009',
N'Quy Nhơn','', 11000000, 0);
INSERT INTO NHANVIEN VALUES('P001', N'Nguyễn Hoài', N'Phong', '06/14/1986', '03/01/2009',
N'Quy Nhơn','056-891135', 13000000, 0);
INSERT INTO NHANVIEN VALUES('Q001', N'Trương Thị Thế', N'Quang', '06/17/1987', '03/01/2009',
N'Ayunpa','0979-792176', 10000000, 500000);
INSERT INTO NHANVIEN VALUES('T001', N'Nguyễn Đức', N'Thắng', '09/13/1984', '03/01/2009',
N'Phù Mỹ', '0955-593893', 1200000,0);
INSERT INTO NHANVIEN VALUES('D001', N'Nguyễn Minh', N'Đăng', '12/29/1987', '03/01/2009',
N'Quy Nhơn','0905-779919', 14000000, 0);
INSERT INTO NHANVIEN VALUES('M001', N'Hồ Thị Phương', N'Mai', '09/14/1987', '03/01/2009',
N'Tây Sơn','', 9000000, 500000);
INSERT INTO NHACUNGCAP VALUES('VNM', N'Công ty sữa Việt Nam', 'VINAMILK', N'Hà Nội',
'04-891135', '', '');
INSERT INTO MATHANG VALUES('NT02', N'Bàn ghế Salon', 'DAF', 'NT', 20, N'Bộ', 150000);
INSERT INTO MATHANG VALUES('DC01', N'Vở học sinh cao cấp', 'GOL', 'DC', 20000 , N'Ram',
48000);
INSERT INTO MATHANG VALUES('DC02', N'Viết bi học sinh', 'GOL', 'DC', 2000 , N'Cây', 2000);
INSERT INTO MATHANG VALUES('DC03', N'Hộp màu tô', 'GOL', 'DC', 2000 , N'Hộp', 7500);
INSERT INTO MATHANG VALUES('DC04', N'Viết mực cao cấp', 'GOL', 'DC', 2000 , N'Cây',
20000);
INSERT INTO MATHANG VALUES('DC05', N'Viết chì 2B', 'GOL', 'DC', 2000 , N'Cây', 3000);
INSERT INTO MATHANG VALUES('DC06', N'Viết chì 4B', 'GOL', 'DC', 2000 , N'Cây', 6000);
INSERT INTO DONDATHANG VALUES(1, 1, 'A001', '09/20/2007', '10/01/2007', '10/01/2007', N'Hà
Nội');
INSERT INTO DONDATHANG VALUES(2, 1, 'H001', '09/20/2007', '10/01/2007', '10/01/2007', N'Hà
Nội');
INSERT INTO DONDATHANG VALUES(3, 2, 'H002', '09/20/2007', '10/01/2007', '10/01/2007', N'Sài
Gòn');
INSERT INTO DONDATHANG VALUES(4, 3, 'H003', '09/20/2007', '10/01/2007', '10/01/2007', N'Sài
Gòn');
INSERT INTO DONDATHANG VALUES(5, 4, 'P001', '09/20/2007', '10/01/2007', '10/01/2007', N'Hà
Nội');
INSERT INTO DONDATHANG VALUES(6, 5, 'D001', '09/20/2007', '10/01/2007', '10/01/2007', N'Hà
Nội');
INSERT INTO DONDATHANG VALUES(7, 6, 'M001', '09/20/2007', '10/01/2007', '10/01/2007', N'Hà
Nội');
INSERT INTO DONDATHANG VALUES(8, 2, 'Q001', '09/20/2007', '10/01/2007', '10/01/2007', N'Sài
Gòn');
INSERT INTO DONDATHANG VALUES(9, 3, 'T001', '09/20/2007', '10/01/2007', '10/01/2007', N'Sài
Gòn');
INSERT INTO CHITIETDATHANG VALUES(9, 'DC01', 48000, 1000, 0);
INSERT INTO CHITIETDATHANG VALUES(9, 'DC02', 2000, 1000, 0);
INSERT INTO CHITIETDATHANG VALUES(9, 'DC03', 7500, 1000, 0);
giảm giá/100)
13.Hãy cho biết có những khách hàng nào lại chính là đối tác cung cấp hàng cho công ty (tức là
có cùng tên giao dịch)
14.Trong công ty có những nhân viên nào có cùng ngày sinh
15.Những đơn hàng nào yêu cầu giao hàng ngay tại công ty đặt hàng và những đơn đó là của công
ty nào
16.Cho biết tên công ty, tên giao dịch, địa chỉ và điện thoại của các khách hàng và nhà cung cấp
hàng cho công ty
17.Những mặt hàng nào chưa từng được khách hàng đặt mua
18.Những nhân viên nào của công ty chưa từng lập hóa đơn đặt hàng nào
19.Những nhân viên nào của công ty có lương cơ bản cao nhất
20.Tổng số tiền mà khách hàng phải trả cho mỗi đơn đặt hàng là bao nhiêu
21.Trong năm 2006 những mặt hàng nào đặt mua đúng mộ lần
22.Mỗi khách hàng phải bỏ ra bao nhiêu tiền để đặt mua hàng của công ty
23.Mỗi nhân viên của công ty đã lập bao nhiêu đơn đặt hàng (nếu chưa hề lập hóa đơn nào thì cho
kết quả là 0)
24.Tổng số tiền hàng mà công ty thu được trong mỗi tháng của năm 2006 (thời gian được tính
theo ngày đặt hàng)
25.Tông số tiền lời mà công ty thu được từ mỗi mặt hàng trong năm 2006
26.Số lượng hàng còn lại của mỗi mặt hàng mà công ty đã có (tổng số lượng hàng hiện có và đã
bán)
27.Nhân viên nào của công ty bán được số lượng hàng nhiều nhất và số lượng hàng bán được của
mhữmg nhân viên này là bao nhiêu
28.Đơn đặt hàng nào có số lượng hàng được đặt mua ít nhất
29.Số tiền nhiều nhất mà khách hàng đã từng bỏ ra để đặt hàng trong các đơn đặt hàng là bao
nhiêu
30.Mỗi một đơn đặt hàng đặt mua những mặt hàng nào và tổng số tiền của đơn đặt hàng
31.Mỗi một loại hàng bao gồm những mặt hàng nào, tổng số lượng của mỗi loại và tổng số lượng
của tất cả các mặt hàng hiện có trong cty
32.Thông kê trong năm 2006 mỗi một mặt hàng trong mỗi tháng và trong cả năm bán được với số
--CÂU 1:
/* Cho biết danh sách các đối tác cung cấp hàng cho công ty*/
SELECT * FROM NHACUNGCAP
SELECT * FROM MATHANG
SELECT * FROM NHANVIEN
SELECT DISTINCT NHACUNGCAP.MACONGTY, TENCONGTY
FROM NHACUNGCAP, MATHANG
WHERE NHACUNGCAP.MACONGTY=MATHANG.MACONGTY
--CÂU 2
/* Mã hàng, tên hàng và số lượng của các mặt hàng hiện có trong công ty*/
SELECT MAHANG, TENHANG,SOLUONG
FROM MATHANG
COMPUTE COUNT(MAHANG), SUM(SOLUONG)
--CÂU 3
/* Họ tên, địa chỉ và năm bắt đầu làm việc của các nhân viên trong cty*/
SELECT HO, TEN, DIACHI, YEAR(NGAYLAMVIEC) AS NAM
FROM NHANVIEN
--CÂU 4
/* Địa chỉ, điện thoại của nhà cung cấp có tên giao dịch VINAMILK*/
SELECT *
FROM NHACUNGCAP
WHERE TENGIAODICH='VINAMILK'
--CÂU 5
/* Mã và tên của các mặt hàng có giá trị lớn hơn 100000 và số lượng hiện có ít hơn 50*/
SELECT *
FROM MATHANG
WHERE (GIAHANG>100000) AND (SOLUONG<50)
--CÂU 6
/* Cho biết mỗi mặt hàng trong công ty do ai cung cấp*/
SELECT DISTINCT MATHANG.MAHANG, TENHANG, TENCONGTY
SELECT * FROM DONDATHANG
SELECT KHACHHANG.MAKHACHHANG, TENCONGTY, HO, TEN,NGAYGIAOHANG, NOIGIAOHANG
FROM KHACHHANG, NHANVIEN, DONDATHANG
WHERE NHANVIEN.MANHANVIEN=DONDATHANG.MANHANVIEN AND
KHACHHANG.MAKHACHHANG=DONDATHANG.MAKHACHHANG AND
SOHOADON=1
--CÂU 11
/* Hãy cho biết số tiền lương mà công ty phải trả cho mỗi nhân viên là bao nhiêu (lương=lương cơ
bản+phụ cấp)*/
SELECT HO, TEN, LUONGCOBAN+PHUCAP AS 'LƯƠNG'
FROM NHANVIEN
--CÂU 12
/* Trong đơn đặt hàng số 3 đặt mua những mặt hàng nào và số tiền mà khách hàng phải trả cho mỗi
mặt hàng là bao nhiêu(số tiền phải trả=số lượng x giá bán – số lượng x giá bán x mức giảm giá/100)
*/
SELECT * FROM MATHANG
SELECT MATHANG.MAHANG, SOHOADON, TENHANG, CHITIETDATHANG.SOLUONG*GIABAN*(1-
MUCGIAMGIA/100) AS 'SỐ TIỀN PHẢI TRẢ'
FROM MATHANG, CHITIETDATHANG
WHERE MATHANG.MAHANG=CHITIETDATHANG.MAHANG AND
CHITIETDATHANG.SOHOADON=3
--CÂU 13
/* Hãy cho biết có những khách hàng nào lại chính là đối tác cung cấp hàng cho công ty
(tức là có cùng tên giao dịch)*/
SELECT KHACHHANG.TENCONGTY, KHACHHANG.TENGIAODICH
FROM KHACHHANG, NHACUNGCAP
WHERE KHACHHANG.TENGIAODICH=NHACUNGCAP.TENGIAODICH
--CÂU 14
/* Trong công ty có những nhân viên nào có cùng ngày sinh*/
SELECT B.HO, B.TEN, B.NGAYSINH
SELECT * FROM DONDATHANG
SELECT * FROM CHITIETDATHANG
/*SELECT DISTINCT DONDATHANG.MAKHACHHANG,CHITIETDATHANG.SOHOADON,
SUM(SOLUONG*GIABAN) AS 'THANHTIEN'
FROM CHITIETDATHANG, DONDATHANG
GROUP BY MAKHACHHANG, CHITIETDATHANG.SOHOADON*/
--CÁCH 1
SELECT DONDATHANG.MAKHACHHANG, CHITIETDATHANG.SOHOADON, SUM(SOLUONG*GIABAN)
AS 'THANHTIEN'
FROM CHITIETDATHANG, DONDATHANG
WHERE DONDATHANG.SOHOADON=CHITIETDATHANG.SOHOADON
GROUP BY MAKHACHHANG,CHITIETDATHANG.SOHOADON
--CÁCH 2:
SELECT dondathang.sohoadon,dondathang.makhachhang,tencongty,
tengiaodich,SUM(soluong*giaban)as 'thanhtien'
--SUM(soluong*giaban-soluong*giaban*mucgiamgia/100)
FROM (khachhang INNER JOIN dondathang
ON khachhang.makhachhang=dondathang.makhachhang)
INNER JOIN chitietdathang
ON dondathang.sohoadon=chitietdathang.sohoadon
GROUP BY dondathang.makhachhang,tencongty,tengiaodich, dondathang.sohoadon
--CÂU 21
--Trong năm 2006 những mặt hàng mà đặt mua đúng một lần
SELECT MATHANG.MAHANG, TENHANG
FROM (MATHANG INNER JOIN CHITIETDATHANG
ON MATHANG.MAHANG=CHITIETDATHANG.MAHANG)INNER JOIN DONDATHANG
ON CHITIETDATHANG.SOHOADON=DONDATHANG.SOHOADON
WHERE YEAR(NGAYDATHANG)=2007
GROUP BY MATHANG.MAHANG, TENHANG
HAVING COUNT(CHITIETDATHANG.MAHANG)=1
--CÂU 24
/* Tổng số tiền hàng mà công ty thu được trong
mỗi tháng của năm 2006 (thời gian được tính theo ngày đặt hàng)*/
SELECT MONTH(NGAYDATHANG) AS THANG,
SUM(SOLUONG*GIABAN-SOLUONG*GIABAN*MUCGIAMGIA/100)AS 'SO TIEN THU DUOC'
FROM DONDATHANG, CHITIETDATHANG
WHERE DONDATHANG.SOHOADON=CHITIETDATHANG.SOHOADON AND
YEAR(NGAYDATHANG) = 2007
GROUP BY MONTH(NGAYDATHANG)
--CÂU 25
/* Tổng số tiền lời mà công ty thu được từ mỗi mặt hàng trong năm 2006 */
SELECT C.MAHANG, TENHANG,
SUM(B.SOLUONG*GIABAN-B.SOLUONG*GIABAN*MUCGIAMGIA/100)-
SUM(B.SOLUONG*GIAHANG) AS 'TIEN LOI'
FROM DONDATHANG AS A, CHITIETDATHANG AS B, MATHANG AS C
WHERE A.SOHOADON=B.SOHOADON AND
B.MAHANG=C.MAHANG AND
YEAR(NGAYDATHANG)=2007
GROUP BY C.MAHANG, TENHANG
ORDER BY MAHANG
COMPUTE sum(SUM(B.SOLUONG*GIABAN-B.SOLUONG*GIABAN*MUCGIAMGIA/100)-
SUM(B.SOLUONG*GIAHANG))
--CÂU 26
/* Tổng số lượng hàng
của mỗi mặt hàng mà công ty đã có (tổng số lượng hàng hiện có và đã bán)*/
SELECT MATHANG.MAHANG, TENHANG,SUM(MATHANG.SOLUONG-CHITIETDATHANG.SOLUONG)
AS 'TONG SO LUONG CON'
FROM CHITIETDATHANG, MATHANG
WHERE MATHANG.MAHANG=CHITIETDATHANG.MAHANG
GROUP BY MATHANG.MAHANG, TENHANG
SELECT DONDATHANG.SOHOADON, SUM(SOLUONG)AS 'SO LUONG HANG DAT MUA IT NHAT'
FROM DONDATHANG, CHITIETDATHANG
WHERE DONDATHANG.SOHOADON=CHITIETDATHANG.SOHOADON
GROUP BY DONDATHANG.SOHOADON
HAVING SUM(SOLUONG)<=ALL(SELECT SUM(SOLUONG)
FROM DONDATHANG, CHITIETDATHANG
WHERE DONDATHANG.SOHOADON=CHITIETDATHANG.SOHOADON
GROUP BY DONDATHANG.SOHOADON)
--CÂU 29
/* Số tiền nhiều nhất mà khách hàng đã từng bỏ ra để đặt hàng trong các đơn đặt hàng
là bao nhiêu*/
SELECT TOP 1 SUM(SOLUONG*GIABAN-SOLUONG*GIABAN*MUCGIAMGIA/100)
FROM CHITIETDATHANG, DONDATHANG
WHERE CHITIETDATHANG.SOHOADON=DONDATHANG.SOHOADON
ORDER BY 1 DESC
--CÂU 30
/*Mỗi một đơn đặt hàng đặt mua những mặt hàng nào và tổng số tiền của đơn đặt hàng*/
SELECT B.SOHOADON, B.MAHANG, C.TENHANG, SUM(B.SOLUONG*GIABAN) AS 'TONG SO TIEN'
FROM DONDATHANG A, CHITIETDATHANG B, MATHANG C
WHERE A.SOHOADON=B.SOHOADON AND B.MAHANG=C.MAHANG
GROUP BY B.SOHOADON, B.MAHANG, C.TENHANG
ORDER BY B.SOHOADON
COMPUTE COUNT(B.MAHANG),SUM(SUM(B.SOLUONG*GIABAN)) BY B.SOHOADON
--CÂU 31
/* Mỗi một loại hàng bao gồm những mặt hàng nào, tổng số lượng của mỗi loại và
tổng số lượng của tất cả các mặt hàng hiện có trong cty*/
SELECT LOAIHANG.MALOAIHANG, LOAIHANG.TENLOAIHANG, MAHANG, TENHANG, SOLUONG
FROM LOAIHANG, MATHANG
WHERE MATHANG.MALOAIHANG=LOAIHANG.MALOAIHANG
ORDER BY LOAIHANG.MALOAIHANG
ELSE 0 END) AS Thang11,
SUM(CASE MONTH(ngaydathang) WHEN 12 THEN b.soluong
ELSE 0 END) AS Thang12,
SUM(b.soluong) AS CaNam
FROM (dondathang AS a INNER JOIN chitietdathang AS b
ON a.sohoadon=b.sohoadon)
INNER JOIN mathang AS c ON b.mahang=c.mahang
WHERE YEAR(ngaydathang)=2007
GROUP BY b.mahang,tenhang
--CÂU 33
/* Cập nhật lại giá thị trường NGAYCHUYENHANG của những bản ghi có NGAYCHUYENHANG chưa
xác định
(NULL) trong bảng DONDATHANG bằng với giá trị của trường NGAYDATHANG*/
UPDATE DONDATHANG
SET NGAYCHUYENHANG=NGAYDATHANG
WHERE NGAYCHUYENHANG IS NULL
SELECT * FROM DONDATHANG
--CÂU 34
UPDATE MATHANG
SET SOLUONG=SOLUONG*2
FROM NHACUNGCAP
WHERE NHACUNGCAP.MACONGTY=MATHANG.MACONGTY AND
TENGIAODICH=N'VINAMILK'
SELECT * FROM MATHANG
--CÂU 35
/* Cập nhật giá trị của trường NOIGIAOHANG trong bảng DONDATHANG bằng
địa chỉ của khách hàng đối với những đơn đặt hàng chưa xác định được nơi
giao hàng (giá trị trường NOIGIAOHANG bằng NULL).*/
UPDATE DONDATHANG
SET NOIGIAOHANG=DIACHI
--CÂU 38
/* Tăng phụ cấp lên bằng 50% lương cho những nhân viên bán được hàng nhiều nhất.*/
UPDATE NHANVIEN
SET PHUCAP=LUONGCOBAN/2
WHERE MANHANVIEN IN
(SELECT MANHANVIEN
FROM DONDATHANG, CHITIETDATHANG
WHERE DONDATHANG.SOHOADON=CHITIETDATHANG.SOHOADON
GROUP BY MANHANVIEN
HAVING SUM(SOLUONG)>=ALL
(SELECT SUM(SOLUONG)
FROM DONDATHANG, CHITIETDATHANG
WHERE DONDATHANG.SOHOADON=CHITIETDATHANG.SOHOADON
GROUP BY MANHANVIEN))
SELECT * FROM NHANVIEN
--CÂU 39
/* Giảm 25% lương của những nhân viên trong năm 2003 không lập được bất kỳ đơn đặt hàng nào.*/
UPDATE NHANVIEN
SET LUONGCOBAN=LUONGCOBAN*0.85
WHERE NOT EXISTS (SELECT MANHANVIEN
FROM DONDATHANG
WHERE MANHANVIEN=NHANVIEN.MANHANVIEN AND
YEAR(NGAYDATHANG)=2003)
SELECT * FROM NHANVIEN
--CÂU 40
/* Giả sử trong bảng DONDATHANG có thêm trường SOTIEN cho biết số tiền mà khách hàng
phải trả trong mỗi đơn đặt hàng. Hãy tính giá trị cho trường này.*/
ALTER TABLE DONDATHANG ADD SOTIEN INT
UPDATE DONDATHANG
SET SOTIEN=(SELECT SUM(SOLUONG*GIABAN+SOLUONG*GIABAN*MUCGIAMGIA)
bất kỳ đơn đặt hàng nào.*/
DELETE FROM MATHANG
WHERE SOLUONG=0 AND NOT EXISTS(SELECT SOHOADON
FROM CHITIETDATHANG
WHERE MAHANG=MATHANG.MAHANG)
SELECT * FROM MATHANG