Một đơn đặt hàng chỉ gởi cho một nhà cung cấp, trong đơn đặt hàng có thông tin mã đơn đặt hàng để phân biệt các đơn đặt hàng, ngày đặt hàng; một nhà cung cấp có thể được đặt hàng nhiều l
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA CÔNG NGHỆ THÔNG TIN
Lê An Khánh_N19DCCN088
Trang 2Mục tiêu :
THIẾT KẾ CƠ SỞ DỮ LIỆU QUẢN LÝ BÁN ĐỒNG HỒ ONLINE
2.Khảo sát thực tế bài toán :
- Công ty bán nhiều đồng hồ, thông tin đồng hồ bao gồm mã đồng hồ để phân biệt các đồng hồ với nhau, tên đồng hồ, giá, số lượng tồn, mô tả, trạng thái, hình ảnh Một loại đồng hồ có nhiều đồng hồ và một đồng hồ có 1 loại đồng hồ
- Một đồng hồ thuộc 1 hãng đồng hồ, một hãng có nhiều đồng hồ
- Nhà cung cấp sẽ cung cấp nhiều đồng hồ thuộc các hãng khác nhau Nhà cung cấp sẽ có thông tin: mã nhà cung cấp để phân biệt với nhà cung cấp khác, tên nhà cung cấp, địa chỉ, email, số điện thoại.
- Công ty có nhiều nhân viên, mỗi nhân viên có thông tin bao gồm mã nhân viên để phân biệt các nhân viên, họ, tên, giới tính, ngày sinh, địa chỉ, số điện thoại, email.
- Khi công ty muốn nhập hàng thì phải đặt hàng cho nhà cung cấp Một đơn đặt hàng chỉ gởi cho một nhà cung cấp, trong đơn đặt hàng có thông tin mã đơn đặt hàng để phân biệt các đơn đặt hàng, ngày đặt hàng; một nhà cung cấp có thể được đặt hàng nhiều lần
- Một đơn hàng có thể đặt nhiều đồng hồ khác nhau, một đồng hồ có thể được đặt hàng nhiều lần Một đồng hồ trong đơn đặt hàng phải chỉ rõ số lượng đặt, và đơn giá Ta phải ghi nhận nhân viên nào lập đơn đặt hàng cho nhà cung cấp Một đơn đặt hàng chỉ được lập bởi một nhân viên và một nhân viên lập được nhiều đơn đặt hàng.
- Nhân viên chỉ nhập hàng trên đơn đặt hàng đã lập Phiếu nhập có thông tin
mã phiếu nhập, ngày nhập; Một đơn đặt hàng chỉ có một phiếu nhập, nếu đơn hàng nhập còn thiếu thì xem như bỏ qua các đồng hồ nhập còn thiếu, muốn nhập lại thì ta sẽ lập đơn đặt hàng mới.
- Một phiếu nhập có thể có nhiều đồng hồ khác nhau và một đồng hồ có thể được nhập về nhiều lần với số lượng và giá khác nhau.
Trang 3- Khách hàng có thể đặt hàng online nhiều lần với nhiều phiếu đặt khác nhau; phiếu đặt có thông tin: ngày đặt, họ tên người nhận, địa chỉ người nhận, số điện thoại người nhận, ngày giờ giao hàng Một phiếu đặt của khách hàng tại 1 thời điểm chỉ thuộc 1 trong các trạng thái sau: chờ duyệt, đã phân công nhân viên giao hàng, hoàn tất, đã hủy) và một phiếu đặt chỉ thuộc một khách hàng.
- Một phiếu đặt của khách hàng có thể có nhiều đồng hồ khác nhau và một đồng hồ có thể được đặt nhiều lần trên nhiều phiếu đặt Phiếu đặt sẽ được duyệt bởi một nhân viên
- Khách hàng có thông tin: id, số CMND, họ, tên, giới tính, ngày sinh, địa chỉ,
số điện thoại, email, mã số thuế.
- Đồng hồ có thể thay đổi giá theo thời gian, ta phải ghi nhận nhân viên thiết lập giá mới cho đồng hồ.
- Khi phân công nhân viên giao hàng, nhân viên duyệt đơn hàng sẽ in luôn hóa đơn Một phiếu đặt sẽ có một hóa đơn duy nhất tương ứng, thông tin hóa đơn gồm: số hóa đơn, ngày in hóa đơn, tổng tiền và mã số thuế.
- Khách hàng có thể trả hàng với điều kiện là phải có hóa đơn và được trả nhiều lần Nhân viên sẽ lập phiếu trả ghi nhận các mặt hàng trả, số lượng trả Đồng hồ chỉ được trả trong vòng 1 tuần sau khi mua.
- Các đồng hồ khi bán sẽ được bảo hành với thời gian (số tháng) tùy đồng hồ Mỗi đồng hồ sẽ có 1 phiếu bảo hành riêng gồm số phiếu bảo hành, ngày bắt đầu, ngày kết thúc Khi bảo hành phải ghi rõ trạng thái đồng hồ trước và sau khi bảo hành và nhân viên nhận, nhân viên giao trả.
- Trong năm, công ty sẽ có các đợt khuyến mãi (KM) giảm giá mặt hàng Mỗi đợt khuyến mãi có thông tin: mã đợt KM để phân biệt các đợt KM, lý do KM, ngày bắt đầu, ngày kết thúc Trong 1 đợt KM, mỗi đồng hồ có % giảm giá riêng Một đợt khuyến mãi được tạo bởi 1 nhân viên và 1 nhân viên có thể tạo nhiều đợt khuyến mãi khác nhau.
- Tất cả các phiếu đã lập đều phải ghi nhận nhân viên lập các phiếu đó.
Trang 4PhieuBaoHanh(SoPhieuBH,NgayBD,NgayKT,TrangThaiTruocBH, TrangThaiSauBH) DotKhuyenMai(MaDotKM,LyDoKM,NgayBD,NgayKT,PhanTramGiam)
b/ Mô hình ERD
Trang 5c/ Mô hình dữ liệu quan hệ từ ERD (đạt dạng chuẩn 3)
Trang 6HangDH(MaH,TenH)
DongHo(MaDH,TenDH,Gia,SLTon,MoTa,TrangThai,HinhAnh, MaL,MaH,SoPhieuBH)
NhaCC(MaNCC,TenCC, DiaChi,Email,Sodt)
NhanVien(MaNV,Ho,Ten,GioiTinh,NgaySinh, DiaChi, Sodt,Email)
DonDatHang(MaDDH, NgayDatHang, MaNCC,MaNV)
PhieuNhap(MaPN, NgayNhap, MaNV,MaDDH)
PhieuDat(MaPD,NgayDat,HoTenNN,DiaChiNN,SodtNN, NgayGioGH,TrangThaiGH, MaNV,ID)
KhachHang(ID,CMND,Ho,Ten,GioiTinh,NgaySinh, DiaChi, Sodt ,Email,MaThue)
HoaDon(SoHD,NgayIn,TongTien, MaThue, MaNV,MaPD)
PhieuTra(MaPT,NgayTra,MaNV,SoHD)
PhieuBaoHanh(SoPhieuBH,NgayBD,NgayKT,TrangThaiTruocBH, TrangThaiSauBH, NVNhanBH,NVTraBH)DotKhuyenMai(MaDotKM,LyDoKM,NgayBD,NgayKT,PhanTramGiam, MaNV)
CungCap(MaCC,MaNCC, MaDH)
CTPDat(MaCTPD, SLDat,DonGia,MaDH, MaPD, MaDDH)
CTPNhap(MaCTPN,SLNhap,Gia,MaDH, MaPN)
ThietLap(MaTL, ThoiDiem ,Gia ,MaDH, MaNV)
CTPTra(MaCTPT,SLTra,MaDH, MaPT)
CTKM(MaCTKM,MaDH, MaDotKM)
d/ Mô hình Diagram
Trang 7e/Từ điển dữ liệu
B ả n
g loại đ ồng h ồ
LoaiDH (MaL, TenL)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
Not NULL
Tên loại
Bảng hãng đ ồng h ồ
HangDH (MaH, TenH)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
Not NULL
Tên hãng
Bảng đ ồng h ồ
Trang 8DongHo (MaDH,TenDH,Gia,SLTon,MoTa,TrangThai,HinhAnh, MaL,MaH,SoPhieuBH)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
2 TenDH nvarchar 50 Unique,Not null Tên đồng hồ
8 MaL varchar 10 Khóa ngoại, Not NULL Mã loại
9 MaH varchar 10 Khóa ngoại, Not NULL Mã hãng
10 SoPhieuBH varchar 10 Khóa ngoại, Unique,
Not NULL
Số phiếu bảo hành
NhaCC(MaNCC,TenCC, DiaChi,Email,Sodt)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
NhanVien(MaNV,Ho,Ten,GioiTinh,NgaySinh, DiaChi, Sodt,Email)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
Trang 92 Ho nvarchar 40 Not NULL Họ
or ‘Nữ’,Default: ‘Nam’
Giới tính
DonDatHang(MaDDH, NgayDatHang, MaNCC,MaNV)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
Not NULL
Mã nhà cung cấp
PhieuNhap(MaPN, NgayNhap, MaNV,MaDDH)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
Trang 101 MaPN varchar 10 Khóa chính Mã phiếu nhập
GETDATE()
Ngày giờ nhập
Unique,Not null
Mã đơn đặt hàng
PhieuDat(MaPD,NgayDat,HoTenNN,DiaChiNN,SodtNN, NgayGioGH, TrangThaiGH, MaNV,ID)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
2 NgayDat datetime Default GETDATE() Ngày giờ đặt hàng
4 DiaChiNN nvarchar 50 Not NULL Địa chỉ người nhận
nhận
7 TrangThaiGH varchar 8 Chỉ nhận:
'ChoDuyet' or 'PhanCong' or 'HoanTat' or 'DaHuy'
Trạng thái giao hàng
Trang 118 MaNV varchar 10 Khóa ngoại, Not
KhachHang(ID,CMND,Ho,Ten,GioiTinh,NgaySinh, DiaChi, Sodt ,Email,MaThue)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
dân
‘Nam’ or ‘Nữ’,Default: ‘Nam’
Giới tính
Trang 12 Bảng hóa đơn
HoaDon(SoHD,NgayIn,TongTien, MaThue, MaNV,MaPD)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
GETDATE()
Ngày giờ in hóa đơn
Not null
Mã nhân viên
Unique, Not null
Mã phiếu đặt
PhieuTra(MaPT,NgayTra,MaNV,SoHD)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
1 SoPhieuBH varchar 10 Khóa chính Số phiếu bảo hành
Trang 133 NgayKT date Not null Ngày kết thúc
4 TrangThaiTruocBH nvarchar 20 Trạng thái đồng hồ
trước khi bảo hành
sau khi bảo hành
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
1 MaDotKM varchar 10 Khóa chính Mã đợt khuyến mãi
5 PhanTramGiam decimal (5,2) Not null % giảm giá
Not null
Mã nhân viên
CungCap(MaCC, MaNCC, MaDH)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
Trang 141 MaCC varchar 10 Khóa chính Mã cung cấp
CTPDat(MaCTPD, SLDat, DonGia,MaDH, MaPD, MaDDH)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
1 MaCTPD varchar 10 Khóa chính Mã chi tiết phiếu đặt
CTPNhap(MaCTPN,SLNhap,Gia,MaDH, MaPN)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
1 MaCTPN varchar 10 Khóa chính Mã chi tiết phiếu nhập
Trang 152 SLNhap int >0 Số lượng nhập
ThietLap(MaTL, ThoiDiem ,Gia ,MaDH, MaNV)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
CTPTra(MaCTPT,SLTra,MaDH, MaPT)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
1 MaCTPT varchar 10 Khóa chính Mã chi tiết phiếu trả
Not null
Mã đồng hồ
Trang 16Not null
CTKM(MaCTKM,MaDH, MaDotKM)
STT Thuộc tính Kiểu dữ liệu Độ dài Ràng buộc Ghi chú
1 MaCTKM varchar 10 Khóa chính Mã chi tiết khuyến mãi
Thiết lập các ràng buộc toàn vẹn
1.Ràng buộc toàn vẹn miền giá trị:
Trang 17Quan hệ Thêm Xóa Sửa
Trang 20PhieuBaoHanh + - +( NgayBD, NgayKT)
DotKhuyenMai + - +( NgayBD, NgayKT)
Trang 213.Ràng buộc toàn vẹn liên bộ
Trang 29+RB1: Khách hàng có thể trả hàng với điều kiện là phải có hóa đơn.
Trang 30HoaDon + - *( SoHD)
5.Ràng buộc toàn vẹn khóa ngoại
+RB1: Mỗi đồng hồ chỉ thuộc 1 loại đồng hồ, 1 hãng đồng hồ và có 1 phiếu bảo hành
∀d ∈ DongHo, ∃l ∈ LoaiDH, ∃h ∈ HangDH, ∃p ∈ PhieuBaoHanh
-> d MaL = l MaL AND d.MaH = h MaH AND d.SoPhieuBH = p.SoPhieuBH
Cuối ∀
Tầm ảnh hưởng:
+RB1: Mỗi đơn đặt hàng chỉ được gởi bởi 1 nhà cung cấp và được lập bởi 1 nhân viên
∀d ∈ DonDatHang, ∃ncc ∈ NhaCC, ∃nv ∈ NhanVien
-> d MaNCC = ncc.MaNCC AND d.MaNV = nv MaNV
Cuối ∀
Tầm ảnh hưởng:
Trang 31NhanVien - + *
+RB1: Mỗi phiếu nhập chỉ được nhập bởi 1 nhân viên và chỉ thuộc 1 đơn đặt hàng
∀p ∈ PhieuNhap, ∃nv ∈ NhanVien, ∃d ∈ DonDatHang
-> p MaNV = nv MaNV AND p.MaDDH = d.MaDDH
Cuối ∀
Tầm ảnh hưởng:
+RB1: Mỗi phiếu đặt chỉ được đặt bởi 1 khách hàng và chỉ được duyệt bởi 1 nhân viên
∀p ∈ PhieuDat, ∃k ∈ KhachHang, ∃nv ∈ NhanVien
-> p.ID = k.ID AND p MaNV = nv MaNV
Cuối ∀
Tầm ảnh hưởng:
+RB1: Mỗi hóa đơn chỉ thuộc 1 phiếu đặt và chỉ được in bởi 1 nhân viên
∀h ∈ HoaDon, ∃nv ∈ NhanVien, ∃p ∈ PhieuDat
-> h MaPD = p MaPD AND h.MaNV = nv.MaNV
Trang 32Cuối ∀
Tầm ảnh hưởng:
+RB1: Mỗi phiếu trả chỉ thuộc 1 hóa đơn và chỉ được lập bởi 1 nhân viên
∀p ∈ PhieuTra, ∃h ∈ HoaDon, ∃nv ∈ NhanVien
-> p.SoHD = h.SoHD AND p.MaNV = nv.MaNV
Cuối ∀
Tầm ảnh hưởng:
Trang 33+RB1: Mỗi nhà cung cấp có thể cung cấp nhiều đồng hồ khác nhau và ngược lại.
∃ c ∈ CungCap, ∀ n ∈ NhaCC, ∀ d ∈ DongHo
-> c MaNCC = n MaNCC AND c MaDH = d MaDH
Cuối ∀
Tầm ảnh hưởng:
+RB1: Mỗi phiếu đặt có nhiều đơn đặt hàng khác nhau, nhiều đồng hồ khác nhau, và ngược lại.
Trang 34∃ c ∈ CTPDat, ∀ dh ∈ DongHo, ∀ p ∈ PhieuDat, ∀ ddh ∈ DonDatHang
-> c MaDH = dh MaDH AND c MaPD = p MaPD AND c MaDDH = ddh MaDDH
Cuối ∀
Tầm ảnh hưởng:
+RB1: Mỗi đồng hồ có thể được nhập nhiều lần trên nhiều phiếu nhập khác nhau và ngược lại
∃ c ∈ CTPNhap, ∀ d ∈ DongHo, ∀ p ∈ PhieuNhap
-> c MaDH = d MaDH AND c CTPNhap = p CTPNhap
Cuối ∀
Tầm ảnh hưởng:
Trang 35+RB1: Mỗi đồng hồ có thể được thiết lập lại bởi nhiều nhân viên và ngược lại
∃ t ∈ ThietLap, ∀ d ∈ DongHo, ∀ n ∈ NhanVien
-> t MaDH = d MaDH AND t MaNV = n MaNV
Cuối ∀
Tầm ảnh hưởng:
+RB1: Mỗi đồng hồ có thể được trả lại trên nhiều phiếu trả khác nhau và ngược lại.
∃ c ∈ CTPTra, ∀ d ∈ DongHo, ∀ p ∈ PhieuTra
-> c MaDH = d MaDH AND c MaPT = p MaPT
Cuối ∀
Tầm ảnh hưởng:
Trang 37πCMND, Hớ '+Ten,NgayDat,TongTien ( σTrangThaiGH='ChoDuyet' (PhieuDat*HoaDon*KhachHang))
b/ Liệt kê các đơn đặt hàng chưa nhập hàng trong khoảng thời gian (@tungay,
@denngay) Các đơn hàng in theo thứ tự thời gian đặt tăng dần Kết xuất:
Mã số ĐĐH Ngày đặt Họ tên NV lập phiếu Nhà cung cấp Tổng trị giá
πMaĐH, NgayDatHang, Hớ '+Ten, MaNCC, SLNhap*Gia ( σ@tungay<= NgayDatHang<=@denngay
(DonDatHang*NhanVien*PhieuNhap*CTPNhap))
c/ Tính doanh thu của cửa hàng theo từng tháng trong 1 năm @nam Kết xuất: Tháng Doanh thụ Lưu ý: Tháng không có doanh thu vẫn in ra, và không vượt quá ngày hiện tạị
πThang,( σ NgayIn=@nam ^ TrangThaiGH='HoanTat'
(Thang*HoaDon))
Trang 38b) Bằng ngôn ngữ SQL:
Câu 4a
/*a/ Liệt kê phiếu đặt hàng chờ duyệt của khách hàng
(Số CMND, họ tên KH, Ngày đặt, Tổng tiền)*/
create view View1 as
select kh CMND , 'HoTenKH' = kh Ho + ' ' + kh Ten , pd NgayDat , hd TongTien
from PhieuDat pd
inner join HoaDon hd on pd MaPD = hd MaPD
inner join KhachHang kh on pd ID = kh ID
where TrangThaiGH = 'ChoDuyet'
go
SELECT * FROM View1
drop view view1
go
Câu 4b
/*
b/ Liệt kê các đơn đặt hàng chưa nhập hàng trong khoảng thời gian (@tungay, @denngay).
Các đơn hàng in theo thứ tự thời gian đặt tăng dần.Kết xuất:
Mã số ĐĐH Ngày đặt Họ tên NV lập phiếu Nhà cung cấp Tổng trị giá
*/
CREATE PROCEDURE Cau_4b ( @tungay date , @denngay date )
AS
BEGIN
select DDH MaDDH , N'Ngày đặt' = DDH NgayDatHang , N'Họ Tên NV Lập' = NV Ho + '
' + NV Ten , DDH MaNCC , N'Tổng trị giá' = CTPN SLNhap * CTPN Gia
from DonDatHang DDH
inner join NhanVien NV on DDH MaNV = NV MaNV
inner join PhieuNhap PN on DDH MaDDH = PN MaDDH
inner join CTPNhap CTPN on PN MaPN = CTPN MaPN
Xoá stored procudure
DROP PROCEDURE Cau_4b ;
go
Trang 39Câu 4c
/*
c/ Tính doanh thu của cửa hàng theo từng tháng trong 1 năm @nam.
Kết xuất: Tháng Doanh thu.
Lưu ý: Tháng không có doanh thu vẫn in ra, và không vượt quá ngày hiện tại.
SELECT t Thang , sum ( Case when MONTH ( hd NgayIn )= t Thang then hd TongTien else 0
end ) N'Doanh thu'
from Thang t , HoaDon hd
inner join PhieuDat pd on hd MaPD = pd MaPD
where hd NgayIn < Getdate () AND YEAR ( hd NgayIn )= @nam and
pd TrangThaiGH = 'HoanTat'
group by t Thang
END ;
go
Trang 40Thực thi store procedure
exec Cau_4c 2020 ;
Xoá stored procudure
DROP PROCEDURE Cau_4c ;
chỉ có số lượng bán mới tính trong khoảng thời gian.
*/
Tạo Stored Procedure
CREATE PROCEDURE Cau_4d ( @tungay date , @denngay date , @topp int )
AS
BEGIN
SELECT TOP ( @topp ) WITH TIES dh MaDH , dh TenDH ,
N'Số lượng bán' = sum ( Case when pd TrangThaiGH = 'HoanTat' then ctpd SLDat else 0 end ),
N'Đơn giá nhập trung bình' = sum ( ctpn Gia * ctpn SLNhap )/ count ( ctpn MaCTPN ),
N'Đơn giá xuất trung bình' = sum ( case when pd TrangThaiGH = 'HoanTat' then hd TongTien
else 0 end )/ count ( case when pd TrangThaiGH = 'HoanTat' then hd SoHD else null end ),
N'Lợi nhuận' = sum ( case when pd TrangThaiGH = 'HoanTat' then hd TongTien else 0 end )
sum ( ctpn Gia * ctpn SLNhap )
from DongHo dh , PhieuDat pd , CTPDat ctpd , CTPNhap ctpn , HoaDon hd
where ctpd MaDH = dh MaDH AND ctpn MaDH = dh MaDH and pd MaPD = hd MaPD
and pd.MaPD=ctpd.MaPD
and hd NgayIn BETWEEN @tungay AND @denngay
group by dh MaDH , dh TenDH
order by ( sum ( case when pd TrangThaiGH = 'HoanTat' then hd TongTien else 0 end )
sum ( ctpn Gia * ctpn SLNhap )) desc
END ;
go
Thực thi store procedure
exec Cau_4d '2017-11-22' , '2021-08-06' , 5 ;
Xoá stored procudure
DROP PROCEDURE Cau_4d ;
go