Tải bản đầy đủ (.pdf) (14 trang)

Đồ án xây dựng cơ sở dữ liệu quản lí hoạt động kinh doanh của một siêu thị

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (220.27 KB, 14 trang )

Đề tài : Xây dựng CSDL quản lý các hoạt động kinh doanh của
một siêu thò.
Phụ lục của giáo trình : Knowledge Discovery from Database
Giáo viên : Nguyễn Duy Nhất –
Bài giải
Các yêu cầu tác nghiệp
(1.2) Lập danh sách hàng hóa được mua trong hóa đơn có mã là 1. Danh sách gồm
các thuộc tính : mã hàng, tên hàng, số lượng bán, giá bán.
SELECT CTHD.MaHang, HH.TenHang, CTHD.SoLuong, CTHD.DonGia
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD) inner join HangHoa as HH on
CTHD.MaHang=HH.MaHang
WHERE HD.MaHD=1
(1.3) Lập danh sách mục hàng mà khách hàng có mã là 3242 đã mua trong năm
1998. Danh sách gồm các thuộc tính : mã hàng, tên hàng, tổng số lượng đã mua,
tổng giá trò.
SELECT CTHD.MaHang, HH.TenHang, Sum(CTHD.SoLuong) as TongSoLuong,
Sum(CTHD.SoLuong*CTHD.DonGia) as TongGiaTri
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD) inner join HangHoa as HH on
CTHD.MaHang=HH.MaHang
WHERE (HD.MaKH=3242) and (Year(HD.NgayLap)=1998)
GROUP BY CTHD.MaHang, HH.TenHang
Thử nghiệm câu truy vấn với CSDL Walmart, kết quả trả về gồm 70 dòng có dạng



(1.4) Tính tổng doanh thu của doanh nghiệp (tức tổng số tiền thu về do bán hàng)
trong tháng 1 năm 1998.
SELECT Sum(HD.TongGiaTri) as DoanhThu
FROM HoaDon as HD


WHERE Month(HD.NgayLap)=1 and Year(HD.NgayLap)=1998


1
(1.5) Tính tổng lợi nhuận của doanh nghiệp trong tháng 1 năm 2008.
SELECT Sum((CTHD.DonGia - HH.DonGia)*CTHD.SoLuong) as LoiNhuan
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD) inner join HangHoa as HH on
CTHD.MaHang=HH.MaHang
WHERE Month(HD.NgayLap)=1 and Year(HD.NgayLap)=1998
Kết quả thử nghiệm của các câu truy vấn (1.4) và (1.5) trên CSDL Walmart lần lượt
là 325810.58$ và 227601.42$.
(1.6) Lập bảng thống kê hàng hóa bán ra trong năm 2008. Bảng gồm các cột (các
thuộc tính) : mã hàng, tên hàng, tổng số lượng bán ra, tổng số tiền thu về, tổng lợi
nhuận thu được.
SELECT CTHD.MaHang, HH.TenHang, Sum(CTHD.SoLuong) as TongSoLuong,
Sum(CTHD.SoLuong*CTHD.DonGia) as TongDoanhThu,
Sum((CTHD.DonGia - HH.DonGia)*CTHD.SoLuong) as LoiNhuan
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD) inner join HangHoa as HH on
CTHD.MaHang=HH.MaHang
WHERE Year(HD.NgayLap)=1998
GROUP BY CTHD.MaHang, HH.TenHang
Thử nghiệm câu truy vấn với CSDL Walmart, kết quả trả về có dạng



(1.7) Lập bảng thống kê các loại hàng (nhóm hàng) bán ra trong năm 2008. Bảng
gồm các cột (các thuộc tính) : tên loại hàng, tổng số tiền thu về, tổng lợi nhuận thu
được.

Tương tự (1.6), nhưng phải inner join thêm bảng LoaiHang để có cột tên loại.
SELECT LH.MaLoai, LH.TenLoai, Sum(CTHD.SoLuong) as TongSoLuong,
Sum(CTHD.SoLuong*CTHD.DonGia) as TongDoanhThu,
Sum((CTHD.DonGia - HH.DonGia)*CTHD.SoLuong) as LoiNhuan


2
FROM ((ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD) inner join HangHoa as HH on
CTHD.MaHang=HH.MaHang) inner join LoaiHang as LH on
HH.MaLoai=LH.MaLoai
WHERE Year(HD.NgayLap)=1998
GROUP BY LH.MaLoai, LH.TenLoai
Thử nghiệm câu truy vấn với CSDL Walmart, kết quả trả về có dạng



(1.8) Lập bảng thống kê tình hình tiêu thụ (doanh thu) của các mặt hàng theo từng
tháng trong năm 1998. Bảng gồm 15 cột, cột thứ nhất là mã hàng, cột thứ 2 là tên
hàng, 12 cột tiếp theo là doanh thu của từng mặt hàng trong từng tháng, cột thứ 15
là doanh thu trung bình.
Ta tư duy bài toán theo kiểu tập hợp. Bảng thống kê cần lập là một tập hợp nhiều
dòng dữ liệu, mỗi dòng biểu diễn tình hình tiêu thụ của một mặt hàng trong từng
tháng của năm 1998, nghóa là mỗi dòng là một bộ số liệu gồm 15 giá trò (ứng với 14
cột). Gọi q là tập hợp cần tìm, q được viết dưới dạng
(
)
{
}
12 12

q a, b,c ,c , ,c ,tb=
,
trong đó a ứng với cột mã hàng, b ứng với tên hàng, và … ứng với doanh thu
của 12 tháng, tb ứng với doanh thu trung bình.
1
c
12
c
Nhận xét rằng a phải là một mã hàng trong toàn bộ các mã hàng của bảng
HangHoa, hiểu nôm na là, nếu bảng HangHoa có n dòng, nghóa là doanh nghiệp có
n mặt hàng, thì q cũng phải có n dòng, và mỗi dòng mô tả doanh thu của từng mặt
hàng trong 12 tháng. Do đó, q được đònh nghóa bởi
()
()
12 12
12 12
a HangHoa.MaHang,
b HangHoa : MaHang a .TenHang,
q a,b,c ,c , ,c
c ,c , ,c ,
tb
⎧∈
⎪⎪
==
⎪⎪
=
⎨⎬
⎪⎪
⎪⎪
⎩⎭


,
trong đó


3


4
)(
i1
cqa,i=
, với mọi , và
i 1,2, ,12=
(
)
1
qx,y
là câu truy vấn (con) trả về doanh
thu của mặt hàng có mã là x trong tháng thứ y của năm 1998,
()
1
tb q x

=
, là doanh thu trung bình (theo tháng) của mặt hàng có mã là x trong
năm 1998.
(
1
qx,y

)
được viết bằng SQL là
SELECT Sum(CTHD.SoLuong*CTHD.DonGia)
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD)
WHERE (CTHD.MaHang=x) and
(Year(HD.NgayLap)=1998) and (Month(HD.NgayLap)=y)

()
1
tb q x

=

Từ đó, ta có dạng SQL của q là
SELECT HH.MaHang, HH.TenHang,
(SELECT Sum(CTHD.SoLuong*CTHD.DonGia)
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD)
WHERE (CTHD.MaHang=HH.MaHang) and
(Year(HD.NgayLap)=1998) and (Month(HD.NgayLap)=1)
) as Thang1,
(SELECT Sum(CTHD.SoLuong*CTHD.DonGia)
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD)
WHERE (CTHD.MaHang=HH.MaHang) and
(Year(HD.NgayLap)=1998) and (Month(HD.NgayLap)=2)
) as Thang2,




(SELECT Sum(CTHD.SoLuong*CTHD.DonGia)
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD)
WHERE (CTHD.MaHang=HH.MaHang) and
(Year(HD.NgayLap)=1998) and (Month(HD.NgayLap)=12)
) as Thang12
FROM HangHoa as HH

Thử nghiệm câu truy vấn với CSDL Walmart, kết quả trả về có dạng



(1.9) Lập bảng thống kê doanh thu và lợi nhuận của doanh nghiệp trong 12 tháng
của năm 1998. Bảng gồm 3 cột : tháng, doanh thu, và lợi nhuận (do đó bảng sẽ có
12 dòng dữ liệu ứng với 12 tháng).
Bảng thống kê cần lập là một tập hợp q có dạng
(
)
{
}
qa,b,c=
,
trong đó q có 12 phần tử, tức 12 bộ số liệu có dạng
(
)
a,b,c
.
Nhận xét rằng a phải mang các giá trò từ 1 đến 12, nghóa là a thuộc tập hợp
{

}
1,2, ,12
, khi đó b và c sẽ là doanh thu và lợi nhuận của tháng thứ a. Do trong
CSDL hiện tại không có bảng nào chứa tập hợp
{
}
1,2, ,12
, nên ta cần tạo một
bảng dữ liệu mới, ta đặt tên cho bảng này là CacThang, bảng này chỉ cần có một
cột, và ta nhập sẵn 12 giá trò là 12 số từ 1 đến 12 cho bảng.

Thang
1
2
3
4
5
6
7
8
9
10
11
12

Gọi là doanh thu của doanh nghiệp trong tháng thứ x của năm 1998.
()
1
qx
(

)
1
qx

được viết bằng SQL như sau
SELECT Sum(HD.TongGiaTri)
FROM HoaDon as HD


5
WHERE (Year(HD.NgayLap)=1998) and (Month(HD.NgayLap)=x)
Gọi là lợi nhuận của doanh nghiệp trong tháng thứ x của năm 1998.
()
2
qx
(
)
2
qx

được viết bằng SQL như sau
SELECT Sum((CTHD.DonGia − HH.DonGia)*CTHD.SoLuong)
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD) inner join HangHoa as HH on
CTHD.MaHang=HH.MaHang
WHERE Month(HD.NgayLap)=x and Year(HD.NgayLap)=1998
Khi đó, dạng SQL của q sẽ là
SELECT CT.Thang,

(SELECT Sum(HD.TongGiaTri)

FROM HoaDon as HD
WHERE (Year(HD.NgayLap)=1998) and
(Month(HD.NgayLap)=CT.Thang)
) as DoanhThu,
(SELECT Sum((CTHD.DonGia - HH.DonGia)*CTHD.SoLuong)
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD) inner join HangHoa as HH on
CTHD.MaHang=HH.MaHang
WHERE Month(HD.NgayLap)=CT.Thang and
Year(HD.NgayLap)=1998
) as LoiNhuan
FROM CacThang as CT

Thử nghiệm câu truy vấn với CSDL Walmart, kết quả trả về có dạng



(5.4) Lập bảng thống kê khối lượng giao dòch của các khách hàng trong năm 1998.
Bảng gồm các cột : mã khách hàng, họ tên khách hàng, ngày sinh, tổng khối lượng


6
giao dòch (là tổng số tiền mà khách hàng này đã mua hàng của doanh nghiệp), tổng
lợi nhuận (mà doanh nghiệp thu được từ khách hàng này).
Bảng thống kê cần lập là một tập hợp q có dạng
(
)
{
}
q a,b,c,d,e=

,
trong đó a là một mã khách hàng, và b, c, d, e là thông tin về khách hàng có mã là
a. Nếu a được xác đònh trong bảng HoaDon thì bảng thống kê lập được sẽ bỏ qua
các khách hàng nào không có mua hàng trong năm 1998. Mặt khác, nếu a được xác
đònh trong bảng KhachHang, thì trong bảng thống kê lập được, các dòng ứng với
khách hàng nào không có mua hàng trong năm 1998 sẽ không có giá trò (Null), và
ta sẽ đặt giá trò ở đây bằng 0.
Trong bài giải sau đây, tác giả xác đònh a trong bảng KhachHang. Khi đó, q được
đònh nghóa bởi
()
()
()
()
()
1
2
a KhachHang.MaKH,
b KhachHang : MaKH a .TenKH,
q a,b,c,d,e c KhachHang:MaKH a .NgaySinh,
dqa,
eqa
⎧⎫

⎪⎪
==
⎪⎪
⎪⎪
== =
⎨⎬
⎪⎪

=
⎪⎪
⎪⎪
=
⎩⎭
,
trong đó, và là các câu truy vấn con tính khối lượng giao dòch và lợi
nhuận của khách hàng (có mã là) a.
()
1
qa
()
2
qa
()
1
qa
được viết bằng SQL là
SELECT Sum(HD.TongGiaTri)
FROM HoaDon as HD
WHERE (HD.MaKH=a) and (Year(HD.NgayLap)=1998)
(
)
2
qa
được viết bằng SQL là
SELECT Sum((CTHD.DonGia − HH.DonGia)*CTHD.SoLuong)
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD
)

WHERE (HD.MaKH=a) and (Year(HD.NgayLap)=1998)
Khi đó, dạng SQL của q sẽ là
SELECT KH.MaKH, (KH.HoKH + ' ' + KH.TenKH) as HoTen, KH.NgaySinh,

(SELECT Sum(HD.TongGiaTri)
FROM HoaDon as HD
WHERE (HD.MaKH=KH.MaKH) and (Year(HD.NgayLap)=1998)

) as KhoiLuongGiaoDich,

(SELECT Sum((CTHD.DonGia - HH.DonGia)*CTHD.SoLuong)
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD
) inner join HangHoa as HH on
CTHD.MaHang=HH.MaHang

WHERE (HD.MaKH=KH.MaKH) and (Year(HD.NgayLap)=1998)


7
) as LoiNhuan
FROM KhachHang as KH

Để ý rằng trong bảng thống kê trả về từ câu truy vấn trên, giá trò tại các cột
KhoiLuongGiaoDich và LoiNhuan sẽ là NULL nếu như khách hàng này không có
mua hàng trong năm đang xét (1998).
Thử nghiệm với CSDL Walmart, kết quả có dạng




Để đặt các giá trò NULL là 0, ta có thể sử dụng hàm IsNull (được hỗ trợ bởi SQL
Server, hàm tương ứng trong Access là Nz) theo cách
SELECT KH.MaKH, (KH.HoKH + ' ' + KH.TenKH) as HoTen, KH.NgaySinh,
IsNull
(
(SELECT Sum(HD.TongGiaTri)
FROM HoaDon as HD
WHERE (HD.MaKH=KH.MaKH) and (Year(HD.NgayLap)=1998))
, 0) as KhoiLuongGiaoDich,
IsNull
(
(
SELECT Sum((CTHD.DonGia - HH.DonGia)*CTHD.SoLuong)
FROM (ChiTietHoaDon as CTHD inner join HoaDon as HD on
HD.MaHD=CTHD.MaHD
) inner join HangHoa as HH on
CTHD.MaHang=HH.MaHang

WHERE (HD.MaKH=KH.MaKH) and (Year(HD.NgayLap)=1998))
, 0) as LoiNhuan
FROM KhachHang as KH

Kết quả trở thành



8


Các yêu cầu ra quyết đònh

(1.2) Lập bảng thống kê về mức độ biến động doanh thu của các mặt hàng trong
năm 2008. Bảng gồm các cột : mã hàng, tên hàng, độ lệch chuẩn doanh thu. Sắp
xếp bảng giảm dần theo cột thứ 3.
Ở bài 1.8, ta đã lập được bảng thống kê doanh thu của các mặt hàng theo từng
tháng. Ta lập lại bảng này, nhưng thêm vào cột “Trung bình doanh thu” :

SELECT MaHang, TenHang, ((IsNull(Thang1,0) + IsNull(Thang2,0) +
IsNull(Thang3,0) + IsNull(Thang4,0) + IsNull(Thang5,0) +
IsNull(Thang6,0) + IsNull(Thang7,0) + IsNull(Thang8,0) +
IsNull(Thang9,0) + IsNull(Thang10,0) + IsNull(Thang11,0) +
IsNull(Thang12,0))/12) as TBDoanhThu
FROM (q)
trong đó, q là câu truy vấn ở bài 1.8.
Lại từ bảng này, ta lập bảng thống kê theo như đề bài yêu cầu, nghóa là thêm vào
cột “Độ lệch chuẩn doanh thu” :
SELECT MaHang, TenHang, TBDoanhThu,
((Abs(IsNull(Thang1,0) - TBDoanhThu) +
Abs(IsNull(Thang2,0) - TBDoanhThu) +
Abs(IsNull(Thang3,0) - TBDoanhThu) +
Abs(IsNull(Thang4,0) - TBDoanhThu) +
Abs(IsNull(Thang5,0) - TBDoanhThu) +
Abs(IsNull(Thang6,0) - TBDoanhThu) +
Abs(IsNull(Thang7,0) - TBDoanhThu) +
Abs
(IsNull(Thang8,0) - TBDoanhThu) +
Abs
(IsNull(Thang9,0) - TBDoanhThu) +
Abs(IsNull(Thang10,0) - TBDoanhThu) +
Abs(IsNull(Thang11,0) - TBDoanhThu) +



9
Abs(IsNull(Thang12,0) - TBDoanhThu))/12) as DoLechChuan
FROM (
q
) as q1 inner join (
q

) as q2 on q1.MaHang=q2.MaHang
ORDER BY DoLechChuan Desc
trong đó,
q
là câu truy vấn ở bài 1.8,
q

là câu truy vấn có cột TBDoanhThu vừa
tạo ra ở trên.

(1.3) CEO cần kiểm đònh nhận đònh về thói quen mua hàng của khách hàng rằng :
Nếu khách hàng có mua mã hàng x và mã hàng y cùng lúc thì thường cũng sẽ mua
luôn mã hàng z. Đánh giá độ tin cậy của nhận đònh này.
Trước hết, cần hiểu rõ khái niệm các mặt hàng “có mua cùng lúc” nghóa là được
mua trong cùng một hóa đơn. Để khảo sát độ tin cậy của nhận đònh này, ta cần lập
bảng thống kê về việc các mặt hàng x, y, và z có được mua hay không trong tất cả
các hóa đơn mua hàng. Bảng thống kê như vậy có dạng :

Mã hóa đơn Mặt hàng X Mặt hàng Y Mặt hàng Z
1 Có Không Có
2 Có Có Không
3 Không Có Có

4 Có Có Có
… … … …

trong đó, mặt hàng x được gọi là có mua trong mã hóa đơn i khi trong bảng
ChiTietHoaDon, có 1 dòng t nào đó, mà t.MaHD = i và t.MaHang = x, và ở đây, ta
không quan tâm đến số lượng được mua hay đơn giá bán của x.
Để có được bảng thống kê này, ta cần lập bảng thống kê tương tự, có dạng

Mã hóa đơn Mặt hàng X Mặt hàng Y Mặt hàng Z
1
1
x

1
y

1
z

2
2
x

2
y

2
z

3

3
x
3
y
3
z
4
4
x

4
y

4
z

… … … …

trong đó, các , , lần lượt là số lượng được mua của mặt hàng X, Y, Z trong
mã hóa đơn i, các giá trò này bằng 0 nếu không được mua. Và từ bảng này, ta sẽ
lập được bảng ở trên bằng cách sử dụng phát biểu Case … When để thay các giá trò
khác 0 thành “Có” và các giá trò bằng 0 thành “Không”.
i
x
i
y
i
z
Khi đó, độ tin cậy của nhận đònh sẽ được tính bằng số dòng (số hóa đơn) có mua X,
Y và Z, chia cho số dòng có mua X, Y. Ngược lại, khái niệm

nguy cơ sai lầm của
nhận đònh được tính bằng số dòng có mua X, Y, và không mua Z, chia cho số dòng
có mua X, Y. Rõ ràng, độ tin cậy = 1 − nguy cơ sai lầm.
Bảng thống kê cần lập là một tập hợp có dạng
q


10
(
)
{
}
qa,b,c,d=
,
trong đó a là một mã hóa đơn xác đònh trong HoaDon.MaHD, b là số lượng được
mua của mặt hàng X trong hóa đơn a (b=0 nếu hóa đơn a không có mua X), ý nghóa
tương tự lần lượt cho c và d, ứng với mặt hàng Y và Z.
q được đònh nghóa bởi

()
()
[]
()
[]
()
[]
aHoaDon.MaHD,
b ChiTietHoaDon : MaHD a,MaHang x .SoLuong b 0 ,
qa,b,c,d
c ChiTietHoaDon : MaHD a,MaHang y .SoLuong c 0 ,

d ChiTietHoaDon : MaHD a,MaHang z .SoLuong d 0
⎧∈
⎪ ⎪
===⎡⎤
⎪ ⎪
⎣⎦
⎪ ⎪
=
⎨ ⎬
===⎡⎤
⎣⎦
⎪ ⎪
⎪ ⎪
===⎡⎤
⎣⎦
⎪ ⎪
⎩ ⎭

∨=
∨=
∨=

q được viết dưới dạng SQL
SELECT HD.MaHD,

IsNull((SELECT CTHD.SoLuong

FROM ChiTietHoaDon as CTHD

WHERE CTHD.MaHD=HD.MaHD and CTHD.MaHang=x),0) as X,


IsNull((SELECT CTHD.SoLuong

FROM ChiTietHoaDon as CTHD

WHERE CTHD.MaHD=HD.MaHD and CTHD.MaHang=y),0) as Y,

IsNull((SELECT CTHD.SoLuong

FROM ChiTietHoaDon as CTHD

WHERE CTHD.MaHD=HD.MaHD and CTHD.MaHang=z),0) as Z
FROM HoaDon as HD

Dạng SQL tính độ tin cậy của nhận đònh
SELECT
(SELECT COUNT(q.MaHD)
FROM (…) as q
WHERE q.X>0 and q.Y>0 and q.Z>0
)*100.0/

(SELECT COUNT(q.MaHD)
FROM (…) as q
WHERE q.X>0 and q.Y>0
)
trong đó, dấu … đại diện cho câu truy vấn của q vừa xây dựng được ở trên. Việc phải
nhân tử số cho 100.0, thay vì 100, nhằm đổi kiểu dữ liệu của tử số từ kiểu nguyên
thành kiểu thực.

Thử nghiệm

Do dữ liệu về hóa đơn trong CSDL Walmart là không lớn (chỉ 34015 hóa đơn),
trong khi số mặt hàng lại nhiều (1560 mặt hàng), nên rất khó để tìm được 3 mặt
hàng X, Y, và Z đủ tốt để thử nghiệm (có rất ít hóa đơn cùng mua đồng thời 3 mặt
hàng X, Y, Z). Ta thực hiện đánh giá một nhận đònh khác tương tự, với X, Y, Z là
các loại hàng, thay vì mặt hàng (trong CSDL Walmart chỉ có 110 loại hàng). Và do
các mặt hàng khác nhau, cho dù thuộc cùng một loại, có thể có đơn vò tính của số


11
lượng khác nhau, nên ta sẽ đánh giá trên doanh thu (tức bằng số lượng nhân đơn
giá).
Bảng thống kê q được đònh nghóa lại thành
()
()
()
()
1
1
1
aHoaDon.MaHD,
bqa,x,
qa,b,c,d
cqa,y,
dqa,z
⎧∈
⎪⎪
=
⎪⎪
=
⎨⎬

=
⎪⎪
⎪⎪
=
⎩⎭

)
)
,
trong đó, là câu truy vấn trả về doanh thu của loại hàng x trong hóa đơn có
mã là a. Dạng SQL của là
(
1
qa,x
(
1
qa,x
SELECT Sum(CTHD.SoLuong*CTHD.DonGia)
FROM ChiTietHoaDon as CTHD inner join HangHoa as HH
on CTHD.Mahang = HH.MaHang
WHERE CTHD.MaHD=a
GROUP BY HH.MaLoai
HAVING HH.MaLoai=x

Dạng SQL của q là
SELECT HD.MaHD,

IsNull((SELECT Sum(CTHD.SoLuong*CTHD.DonGia)
FROM ChiTietHoaDon as CTHD inner join HangHoa as HH
on CTHD.Mahang = HH.MaHang

WHERE CTHD.MaHD=HD.MaHD
GROUP BY HH.MaLoai
HAVING HH.MaLoai=x),0) as X,

IsNull((SELECT Sum(CTHD.SoLuong*CTHD.DonGia)
FROM ChiTietHoaDon as CTHD inner join HangHoa as HH
on CTHD.Mahang = HH.MaHang
WHERE CTHD.MaHD=HD.MaHD
GROUP BY HH.MaLoai
HAVING HH.MaLoai=y),0) as Y,

IsNull((SELECT Sum(CTHD.SoLuong*CTHD.DonGia)
FROM ChiTietHoaDon as CTHD inner join HangHoa as HH
on CTHD.Mahang = HH.MaHang
WHERE CTHD.MaHD=HD.MaHD
GROUP BY HH.MaLoai
HAVING HH.MaLoai=z),0) as Z
FROM HoaDon as HD

Chạy thử câu truy vấn trên với CSDL Walmart sẽ cho khá nhiều dòng có b, c, d
toàn bằng 0, nên để dễ quan sát, ta lọc đi các dòng như vậy bằng cách
SELECT p.*


12
INTO A
FROM (…) as p
WHERE p.X<>0 or p.Y<>0 or p.Z<>0
trong đó, dấu … đại diện cho nội dung câu truy vấn ở trên. Từ khóa
INTO sau mệnh

đề
SELECT lấy kết quả trả về của câu truy vấn tạo thành một bảng mới trong
CSDL, đặt tên là A.
Thử nghiệm với các loại hàng ngẫu nhiên x=61, y=99, và z=109 trên CSDL
Walmart, kết quả của câu truy vấn trên trả về bảng A có 17242 dòng, thời gian
thực hiện mất khoảng 5 phút trên máy tính Dual-core có tốc độ 1.7Ghz.



Chạy tiếp câu SQL tính độ tin cậy của nhận đònh :



Kết luận : Nhận đònh về thói quen tiêu dùng “Nếu khách hàng có mua loại hàng 61
và loại hàng 99 thì thường cũng sẽ mua loại hàng 109” có độ tin cậy là 12.85%,
nghóa là có nguy cơ sai lầm 87.15%. Điều này tương đương với nhận đònh “Nếu
khách hàng có mua loại hàng 61 và loại hàng 99 thì thường sẽ không mua loại


13
hàng 109” có độ tin cậy là 87.15%. Và sẽ một chút thú vò, khi ta biết rằng, loại
hàng 61, 99, và 109 có tên lần lượt là Fresh Vegetables, Fresh Fruit, Dried Fruit.
Nhận xét : Với 110 loại hàng có trong CSDL Walmart, và chi phí thời gian tính
toán không nhỏ khi đánh giá một nhận đònh, việc tìm ra được các nhận đònh có ý
nghóa và có độ tin cậy cao bằng cách chọn ngẫu nhiên không phải là điều dễ dàng,
nếu không muốn nói là không thể làm được (về mặt lý thuyết, với 110 loại hàng, ta
sẽ có nhận đònh kiểu như trên). Khó khăn này là mở đầu cho các giải
pháp heuristic thông minh để khắc phục, và tìm ra các nhận đònh tốt nhất, và cũng
là trọng tâm nghiên cứu của lónh vực Khám Phá Tri Thức Từ Cơ Sở Dữ Liệu, sẽ
được trình bày trong các chương còn lại của giáo trình này.

110 110
22×





14

×