1. BÀI TẬP SQL 1
Database
use BANHANG_TuNghia
-- Tao bang Khach Hang
create table KHACHHANG(
MaKhachHang char(10) not null primary key,
TenCongTy nvarchar(100),
TenGiaoDich nvarchar(100),
DiaChi nvarchar(255),
email char(50),
DienThoai char(12),
fax char(15)
)
-- Tao bang Don Dat Hang
create table DONDATHANG(
SoHoaDon money not null primary key,
MaKhachHang char(10) not null,
MaNhanVien char(10) not null,
NgayDatHang date not null,
NgayGiaoHang date,
NgayChuyenHang date,
NoiGiaoHang nvarchar(255)
2. )
-- Tao bang Nhan Vien
create table NHANVIEN(
MaNhanVien char(10) not null primary key,
Ho nvarchar(50) not null,
Ten nvarchar(100) not null,
NgaySinh date,
NgayLamViec date,
DiaChi nvarchar(255),
DienThoai char(12),
LuongCoBan money,
PhuCap money
)
-- Tao bang nha cung cap
create table NHACUNGCAP(
MaCongTy char(10) not null primary key,
TenCongTy nvarchar(100) not null,
TenGiaoDich nvarchar(100),
DiaChi nvarchar(255),
DienThoai char(12),
fax char(15),
email char(50)
)
-- Tao Bang Chi Tiet Dat Hang
create table CHITIETDATHANG(
SoHoaDon money not null,
MaHang char(10) not null,
GiaBan money,
SoLuong integer,
MucGiamGia money,
constraint pk_CTDH primary key (SoHoaDon, MaHang)
)
-- Tao bang Mat Hang
create table MATHANG(
MaHang char(10) not null primary key,
TenHang nvarchar(100) not null,
MaCongTy char(10) not null,
MaLoaiHang char(10) not null,
SoLuong integer,
DonViTinh char(20),
GiaHang money
)
-- Tao bang loai hang
create table LOAIHANG(
MaLoaiHang char(10) not null primary key,
TenLoaiHang nvarchar(100) not null
)
-- Them quan he giua KHACHHANG va DONDATHANG
alter table DONDATHANG
add
3. constraint fk_KH_DDH
foreign key(MaKhachHang)
references KHACHHANG(MaKhachHang)
-- Them quan he giua DONDATHANG va NHANVIEN
alter table DONDATHANG
add
constraint fk_DDH_NV
foreign key(MaNhanVien)
references NHANVIEN(MaNhanVien)
-- Them quan He Giua DONDATHANG va CHITIETDATHANG
alter table CHITIETDATHANG
add
constraint fk_DDH_CTDH
foreign key(SoHoaDon)
references DONDATHANG(SoHoaDon)
-- Them quan he giua CHITIETDATHANG va MATHANG
alter table CHITIETDATHANG
add
constraint fk_MT_CTDH
foreign key(MaHang)
references MATHANG(MaHang)
-- Khoa Ngoai giua Nha cung cap va Mat Hang
alter table MATHANG
add
constraint fk_NCC_MH
foreign key(MaCongTy)
references NHACUNGCAP(MaCongTy)
-- Khoa Ngoai giua MATHANG va LOAIHANG
alter table MATHANG
add
constraint fk_MH_LH
foreign key(MaLoaiHang)
references LOAIHANG(MaLoaiHang)
-- Bài 3 : Bổ sung ràng buộc thiết lặp mặc định bằng 1 cho cột SoLuong
alter table CHITIETDATHANG
add constraint default_sl default(1) for SoLuong
-- bằng 0 cho cột MucGiamGia trong bản CHITIETDONHANG
alter table CHITIETDATHANG
add constraint default_mgg default(0) for MucGiamGia
-- Bài 4: Bổ sung cho bảng DONDATHANG rang buộc kiểm tra NgayGiaoHang và
NgayChuyenHang
-- phải sau hoặc bằng NgayDatHang
alter table DONDATHANG
add
constraint check_Date
check(NgayGiaoHang>=NgayDatHang and NgayChuyenHang>=NgayDatHang)
4. -- Bài 5 : Bổ sung cho bảng NHANVIEN để đảm bảo nhân viên chỉ có thể làm việc
từ 18 đến 60
-- Ngày hiện tại DATE(GETDATE())
alter table NHANVIEN
add
constraint tuoi_nv
check(DATEDIFF(YEAR, NgaySinh, NgayLamViec) between 18 and 60)
alter table NHANVIEN
drop constraint tuoi_nv
--Bài 6: Câu lệnh DROP TABLE NHACUNGCAP có thực hiện được không
-- Trả lời : Không vì NHACUNGCAP đang được MATHANG tham chiếu
--Bài 7: Cho khung nhìn được định nghĩa như sau:
create view view_DonHang
as
select dbo.DONDATHANG.SoHoaDon, MaKhachHang, MaNhanVien, NgayDatHang,
NgayGiaoHang, NgayChuyenHang
NoiGiaoHang, MaHang, GiaBan, SoLuong, MucGiamGia
from dbo.DONDATHANG inner join dbo.CHITIETDATHANG
on dbo.DONDATHANG.SoHoaDon = dbo.CHITIETDATHANG.SoHoaDon
-- Có thể thông qua khung nhìn này để bổ sung dữ liệu cho bảng DONADATHANG
được không ?
-- Trả lời : Không.
-- Có thể thông qua khung nhìn này để bổ xung dữ liệu cho bảng CHITIETDONHANG
được không?
-- Trả lời: Không.
-- Có thể qua khung nhìn này để xóa hay cập nhập dữ liệu trong bảng DONDATHANG
được không
-- Trả lời : Có thể cập nhập, Không thể xóa
-- Có thể qua khung nhìn này để cập nhập dữ liệu trong bảng CHITIETDONHANG
được không?
-- Trả lời : Có
-- Nhập dữ liệu cho bảng KHACHHANG
insert into KHACHHANG values('KH001',N'Điện Toán Sài Gòn','CINOTEC',N'43 Yết
Kiêu P6 Q3 TP HCM',null,'7931752',null)
insert into KHACHHANG values('KH002',N'Vật Tư Thiết Bị GTVT','COMECO',N'226 An
Dương Vương P11 Q11 TP HCM',null,'8456781',null)
insert into KHACHHANG values('KH003',N'Phát Hành Sách Sài Gòn','FAHASA',N'12
Thuận Kiều Q5 TP HCM',null,'8452792',null)
insert into KHACHHANG values('KH004',N'Dịch Vụ Đầu Tư Nước Ngoài','FISC',N'31
Trương Định P6 Q1 TP HCM',null,'8458247',null)
insert into KHACHHANG values('KH005',N'Hừng Sáng','HUNSAN',N'175 Lý Thường
Kiệt',null,'5465487',null)
insert into KHACHHANG values('KH006',N'Bột Giặt LIX','LIXCO',N'79 Bàn Cờ P3 Q5
TP HCM',null,'8952187',null)
-- Nhập dữ liệu bảng NHANVIEN
insert into NHANVIEN values('NV001',N'Nguyễn Ngọc',N'Nga',CONVERT(date,
'10/12/64', 3),convert(date, '13/07/04' , 3),N'13 Hùng
Vương','0909123233',4000000,1200000)
5. insert into NHANVIEN values('NV002',N'Hà Vĩnh',N'Phát',CONVERT(date,
'07/12/79', 3),convert(date, '13/06/06' , 3),N'89 Đồng
Khởi',null,2800000,1000000)
insert into NHANVIEN values('NV003',N'Nguyễn Kim',N'Ngọc',CONVERT(date,
'25/12/80', 3),convert(date, '01/09/09' , 3),N'187 Hậu
Giang','0935123789',2100000,null)
insert into NHANVIEN values('NV004',N'Trương Duy',N'Hùng',CONVERT(date,
'10/10/86', 3),convert(date, '24/04/11' , 3),N'77 Trương
Đình','01227678768',1900000,null)
insert into NHANVIEN values('NV005',N'Lê Văn',N'Hùng',CONVERT(date,
'06/03/57', 3),convert(date, '13/07/04' , 3),N'13 Hùng
Vương','0909123233',4700000,1800000)
-- Nhâp dữ liệu cho bảng DONDATHANG
insert into DONDATHANG values(10148,'KH004','NV001',convert(date, '10/01/11' ,
3),null,null,null)
insert into DONDATHANG
values(10150,'KH005','NV004',convert(date,'05/05/11',3),null,null,null)
insert into DONDATHANG
values(10156,'KH004','NV004',convert(date,'12/01/11',3),null,null,null)
insert into DONDATHANG
values(10157,'KH002','NV003',convert(date,'04/07/11',3),null,null,null)
insert into DONDATHANG
values(10226,'KH003','NV003',convert(date,'11/08/11',3),convert(date,'11/09/11
',3),null,N'12 Thuận Kiều Q5 TP HCM')
-- Nhập dữ liệu cho bảng NHACUNGCAP
insert into NHACUNGCAP values('CC001',N'Bột giặt LIX','LIXCO',N'79 Bàn Cờ P3
Q5 TP HCM','8952187',null,null)
insert into NHACUNGCAP values('CC002',N'Thủy Sản Xuất Khẩu','SAFICO',N'47 Bãi
Sậy P1 Q11 TP HCM',null,null,null)
insert into NHACUNGCAP values('CC003',N'Vàng Bạc Đá Quý Sài Gòn','SJC',N'350
CMT8 P12 Q3 TP HCM','8543543',null,null)
insert into NHACUNGCAP values('CC004',N'Thương Mại Tấn Phát','TAFACO',N'4 Trần
Phú Q5 TP HCM','8754875',null,null)
insert into NHACUNGCAP values('CC005',N'Dịch Vụ Vận Tải','TRANACO',N'156 Lê
Đại Thành P7 Q10 TP HCM','8654635',null,null)
insert into NHACUNGCAP values('CC006',N'Nước Giải Khát Sài Gòn','SABICO',N'343
Nhật Tảo Q10',null,null,null)
-- Nhập dữ liệu cho bảng LOAIHANG
insert into LOAIHANG values('1',N'Thực phẩm')
insert into LOAIHANG values('2',N'Nước uống')
insert into LOAIHANG values('3',N'Hoa quả')
insert into LOAIHANG values('4',N'May mặc')
insert into LOAIHANG values('5',N'Gia dụng')
-- Nhập dữ liệu cho bảng MATHANG
insert into MATHANG values('MH001',N'Rượu','CC006','2',4,N'chai',2305000)
insert into MATHANG values('MH002',N'Gia vị','CC004','1',2,N'thùng',400000)
insert into MATHANG values('MH003',N'Táo','CC005','3',28,N'kg',50000)
insert into MATHANG values('MH004',N'Cá hộp','CC002','1',5,N'thùng',650000)
insert into MATHANG values('MH005',N'Áo Việt
Tiến','CC004','4',60,N'cái',203000)
insert into MATHANG values('MH006',N'Bột giặt','CC001','5',9,N'thùng',509000)
-- Nhập dữ liệu cho bảng CHITIETDATHANG
6. insert into CHITIETDATHANG values(10148,'MH003',57000,20,0)
insert into CHITIETDATHANG values(10148,'MH004',720000,1,0)
insert into CHITIETDATHANG values(10150,'MH002',430000,1,0)
insert into CHITIETDATHANG values(10157,'MH001',2700000,2,0)
insert into CHITIETDATHANG values(10157,'MH006',530000,2,0)
insert into CHITIETDATHANG values(10226,'MH004',720000,2,2)
--2.1 Cho biết danh sách các đối tác cung cấp hàng cho công ty.
select * from NHACUNGCAP
--2.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 dbo.MATHANG
--2.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 công ty.
select Ho + ' ' + Ten as HọTên, DiaChi, year(NgayLamViec) as NămLàmViệc
from dbo.NHANVIEN
--2.4 Địa chỉ và điện thoại của nhà cung cấp có tên giao dịch TAFACO là gì ?
select DiaChi, DienThoai
from dbo.NHACUNGCAP
where TenGiaoDich = 'TAFACO'
--2.5 Cho biết mã và tên của các mặt hàng có giá lớn hơn 100000 và số lượng
hiện có ít hơn 50
select MaHang, TenHang
from dbo.MATHANG
where GiaHang > 100000 and SoLuong <50
--2.6 Cho biết mỗi mặt hàng trong công ty do ai cung cấp
select MaHang, TenHang, TenCongTy
from dbo.MATHANG inner join dbo.NHACUNGCAP
on dbo.MATHANG.MaCongTy = dbo.NHACUNGCAP.MaCongTy
--2.7 Công ty Dịch vụ vận tải đã cung cấp những mặt hàng nào.
select MaHang, TenHang
from dbo.MATHANG inner join dbo.NHACUNGCAP
on dbo.MATHANG.MaCongTy = dbo.NHACUNGCAP.MaCongTy
where TenCongTy = N'Dịch vụ vận tải'
--2.8 Loại hàng thực phẩm do những công ty nào cung cấp và địa chỉ của các
công ty đó là gì?
select distinct TenCongTy, DiaChi
from dbo.NHACUNGCAP inner join dbo.MATHANG
on dbo.NHACUNGCAP.MaCongTy = dbo.MATHANG.MaCongTy
inner join dbo.LOAIHANG
on dbo.MATHANG.MaLoaiHang = dbo.LOAIHANG.MaLoaiHang
where TenLoaiHang = N'Thực phẩm'
--2.9 Những khách hàng nào (tên giao dịch) đã đặt mua mặt hàng Cá hộp của công
ty?
select TenGiaoDich
from dbo.KHACHHANG inner join dbo.DONDATHANG
on dbo.KHACHHANG.MaKhachHang = dbo.DONDATHANG.MaKhachHang
inner join dbo.CHITIETDATHANG
on dbo.DONDATHANG.SoHoaDon = dbo.CHITIETDATHANG.SoHoaDon
inner join dbo.MATHANG
on dbo.CHITIETDATHANG.MaHang = dbo.MATHANG.MaHang
7. where TenHang = N'Cá hộp'
--2.10 Đơn đặt hàng số 10148 do ai đặt và do nhân viên nào lập, thời gian và
địa điểm giao hàng là ở đâu?
select TenGiaoDich, Ho + ' ' + Ten as NhanVienLap, NgayGiaoHang, NoiGiaoHang
from dbo.KHACHHANG inner join dbo.DONDATHANG
on dbo.KHACHHANG.MaKhachHang = dbo.DONDATHANG.MaKhachHang
inner join dbo.NHANVIEN
on dbo.DONDATHANG.MaNhanVien = dbo.NHANVIEN.MaNhanVien
where SoHoaDon = 10148
--2.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 MaNhanVien, Ho + ' ' + Ten, (LuongCoBan+isnull(PhuCap,0)) as Lương
from dbo.NHANVIEN
--2.12 Trong đơn đặt hàng số 10266 đặt mua những mặt hàng nào và số tiền mà
khách phải trả cho mỗi mặt
--hàng là bao nhiêu ( số tiền phải được tính theo công thức SoLuong*GiaBan-
SoLuong*GiaBan*MucGiamGia/100)
select TenHang, sum(dbo.CHITIETDATHANG.SoLuong*GiaBan -
dbo.CHITIETDATHANG.SoLuong*GiaBan*MucGiamGia/100) as TienPhaiTra
from dbo.MATHANG inner join dbo.CHITIETDATHANG
on dbo.MATHANG.MaHang = dbo.CHITIETDATHANG.MaHang
group by TenHang
--2.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
của công ty(tức là có cùng tên giao dịch)
select MaKhachHang, TenGiaoDich
from dbo.KHACHHANG
where TenGiaoDich in (
select TenGiaoDich from dbo.NHACUNGCAP
)
--2.14 Trong công ty có những nhân viên nào có cùng ngày vào làm
select * from nhanvien
where NgayLamViec in (
select NgayLamViec
from dbo.NHANVIEN
group by NgayLamViec
having count(MaNhanVien) > =2
)
--2.15 Những đơn đặt hàng nào yêu cầu giao hàng ngay tại công ty đặt hàng và
những đơn
--đặt hàng đó là của công ty nào
select TenCongTy
from dbo.KHACHHANG inner join dbo.DONDATHANG
on dbo.KHACHHANG.MaKhachHang = dbo.DONDATHANG.MaKhachHang
where NoiGiaoHang = DiaChi
--2.16 Cho biết tên công ty, tên giao dịch, địa chỉ và điện thoại của khách
hàng và các nhà
--cung cấp hàng cho công ty
select TenCongTy, TenGiaoDich, DiaChi, DienThoai
from dbo.KHACHHANG
8. union
select TenCongTy, TenGiaoDich, DiaChi, DienThoai
from dbo.NHACUNGCAP
--2.17 Những mặt hàng nào chưa từng được khách hàng đặt mua.
select MaHang, TenHang
from dbo.MATHANG
where MaHang not in (
select distinct MaHang from dbo.CHITIETDATHANG
)
--2.18 Những nhân viên nào của công ty chưa từng lập bất kỳ một hóa đơn đặt
hàng nào?
select MaNhanVien, Ho + ' ' + Ten as HoTen
from dbo.NHANVIEN
where MaNhanVien not in (
select distinct MaNhanVien
from dbo.DONDATHANG
)
--2.19 Những nhân viên nào của công ty có lương cơ bản cao nhất?
select top 3 *
from dbo.NHANVIEN
order by LuongCoBan desc
--2.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
select KHACHHANG.MaKhachHang, TenGiaoDich, dbo.DONDATHANG.SoHoaDon,
sum(GiaBan*SoLuong- GiaBan*SoLuong*MucGiamGia/100) as TongTien
from dbo.KHACHHANG inner join dbo.DONDATHANG
on dbo.KHACHHANG.MaKhachHang = dbo.DONDATHANG.MaKhachHang
inner join dbo.CHITIETDATHANG
on dbo.DONDATHANG.SoHoaDon = dbo.CHITIETDATHANG.SoHoaDon
group by KHACHHANG.MaKhachHang, TenGiaoDich, dbo.DONDATHANG.SoHoaDon
--2.21 Trong năm 2011, Những mặt hàng nào đặt mua đúng một lần.
select dbo.MATHANG.MaHang, TenHang
from dbo.MATHANG inner join dbo.CHITIETDATHANG
on dbo.MATHANG.MaHang = dbo.CHITIETDATHANG.MaHang
inner join dbo.DONDATHANG
on dbo.CHITIETDATHANG.SoHoaDon = dbo.DONDATHANG.SoHoaDon
where year(NgayDatHang)=2011
group by dbo.MATHANG.MaHang, TenHang
having count(dbo.CHITIETDATHANG.SoHoaDon) = 1
--2.22 Hãy cho biết mỗi một khách hàng đã phải bỏ ra bao nhiêu tiền để đặt mua
hàng của công ty?
select dbo.KHACHHANG.MaKhachHang, TenGiaoDich, sum(GiaBan*SoLuong -
GiaBan*SoLuong*MucGiamGia/100)as TongTien
from dbo.KHACHHANG inner join dbo.DONDATHANG
on dbo.KHACHHANG.MaKhachHang = dbo.DONDATHANG.MaKhachHang
inner join dbo.CHITIETDATHANG
on dbo.DONDATHANG.SoHoaDon = dbo.CHITIETDATHANG.SoHoaDon
group by dbo.KHACHHANG.MaKhachHang, TenGiaoDich
--2.23 Mỗi một nhân viên của công ty đã lập bao nhiêu đơn đặt hàng
--(nếu nhân viên chưa hề lập một hoá đơn nào thì cho kết quả là 0).
select dbo.NHANVIEN.MaNhanVien, Ho + ' ' + Ten as HoTen, count(SoHoaDon) as
9. SoHoaDon
from dbo.NHANVIEN left join dbo.DONDATHANG
on dbo.NHANVIEN.MaNhanVien = dbo.DONDATHANG.MaNhanVien
group by dbo.NHANVIEN.MaNhanVien, Ho + ' ' + Ten
--2.24 Cho biết tổng số tiền hàng mà cửa hàng thu được trong mỗi tháng của năm
2003
--(thời gian được tính theo ngày đặt hàng).
select month(NgayDatHang) as Thang, sum(GiaBan*SoLuong -
GiaBan*SoLuong*MucGiamGia/100) as TongTien
from dbo.DONDATHANG inner join dbo.CHITIETDATHANG
on dbo.DONDATHANG.SoHoaDon = dbo.CHITIETDATHANG.SoHoaDon
group by month(NgayDatHang)
--2.25 Hãy cho biết tổng số tiền lời mà công ty thu được từ mỗi mặt hàng trong
năm 2011.
select TenHang, sum(GiaBan*dbo.CHITIETDATHANG.SoLuong -
GiaBan*dbo.CHITIETDATHANG.SoLuong*MucGiamGia/100 -
dbo.CHITIETDATHANG.SoLuong*GiaHang) as TienLoi
from dbo.MATHANG inner join dbo.CHITIETDATHANG
on dbo.MATHANG.MaHang = dbo.CHITIETDATHANG.MaHang
inner join dbo.DONDATHANG
on dbo.CHITIETDATHANG.SoHoaDon = dbo.DONDATHANG.SoHoaDon
where year(NgayDatHang) = 2011
group by TenHang
--2.26 Hãy cho biết 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 t.TenHang, sum(t.Soluong) as TongSoLuong
from(
select TenHang, SoLuong
from dbo.MATHANG
union all
select TenHang, dbo.CHITIETDATHANG.SoLuong
from dbo.MATHANG inner join dbo.CHITIETDATHANG
on dbo.MATHANG.MaHang = dbo.CHITIETDATHANG.MaHang
) as t
group by t.TenHang
--2.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 những nhân viên này là bao nhiêu?
select top 1 dbo.NHANVIEN.MaNhanVien, Ho + ' ' + Ten as HoTen, sum(SoLuong) as
TongSoLuong
from dbo.NHANVIEN inner join dbo.DONDATHANG
on dbo.NHANVIEN.MaNhanVien = dbo.DONDATHANG.MaNhanVien
inner join dbo.CHITIETDATHANG
on dbo.DONDATHANG.SoHoaDon = dbo.CHITIETDATHANG.SoHoaDon
group by dbo.NHANVIEN.MaNhanVien, Ho + ' ' + Ten
order by sum(SoLuong) desc
--2.28 Đơn đặt hàng nào có số lượng hàng được đặt mua ít nhất?
select top 1 SoHoaDon, sum(SoLuong) as SoLuongHang
from dbo.CHITIETDATHANG
group by SoHoaDon
order by sum(SoLuong)
10. --2.29 Số tiền nhiều nhất mà mỗi khách hàng đã từng bỏ ra để đặt hàng trong
các đơn
-- đặt hàng là bao nhiêu?
select dbo.KHACHHANG.MaKhachHang, TenGiaoDich, dbo.DONDATHANG.SoHoaDon,
max((GiaBan*SoLuong - GiaBan*SoLuong*MucGiamGia/100)) as Tien
from dbo.KHACHHANG inner join dbo.DONDATHANG
on dbo.KHACHHANG.MaKhachHang = dbo.DONDATHANG.MaKhachHang
inner join dbo.CHITIETDATHANG
on dbo.DONDATHANG.SoHoaDon = dbo.CHITIETDATHANG.SoHoaDon
group by dbo.KHACHHANG.MaKhachHang, TenGiaoDich, dbo.DONDATHANG.SoHoaDon
--2.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 mà mỗi
đơn
-- đặt hàng phải trả là bao nhiêu?
select dbo.CHITIETDATHANG.SoHoaDon, TenHang, TongTien
from dbo.CHITIETDATHANG inner join dbo.MATHANG
on dbo.CHITIETDATHANG.MaHang = dbo.MATHANG.MaHang
left join
(select SoHoaDon , sum(GiaBan*SoLuong - GiaBan*SoLuong*MucGiamGia/100)
as TongTien
from dbo.CHITIETDATHANG
group by SoHoaDon) as t
on CHITIETDATHANG.SoHoaDon = t.SoHoaDon
--2.31 Hãy cho biết mỗi một loại hàng bao gồm những mặt hàng nào,
--tổng số lượng hà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 công ty là bao nhiêu?
select dbo.LOAIHANG.TenLoaiHang, TenHang, TongMoiLoai
from dbo.LOAIHANG inner join dbo.MATHANG
on dbo.LOAIHANG.MaLoaiHang = dbo.MATHANG.MaLoaiHang
left join (
select TenLoaiHang, sum(SoLuong) as TongMoiLoai
from dbo.LOAIHANG inner join dbo.MATHANG
on dbo.LOAIHANG.MaLoaiHang = dbo.MATHANG.MaLoaiHang
group by TenLoaiHang
) as t
on dbo.LOAIHANG.TenLoaiHang = t.TenLoaiHang
order by dbo.LOAIHANG.TenLoaiHang
compute sum(TongMoiLoai)
--2.32 Thống kê xem trong năm 2011, mỗi một mặt hàng trong mỗi tháng và trong
cả năm bán được
-- với số lượng bao nhiêu?
-- Yêu cầu: Kết quả được hiển thị dưới dạng bảng, hai cột đầu là mã hàng và
tên hàng,
-- các cột còn lại tương ứng với các tháng từ 1 đến 12 và cả năm. Như vậy mỗi
dòng trong
-- kết quả cho biết số lượng hàng bán được mỗi tháng và trong cả năm của mỗi
mặt hàng.
select mh.MaHang, TenHang,
sum(case month(NgayDatHang) when 1 then ctdh.SoLuong else 0 end) as
Thang1,
sum(case month(NgayDatHang) when 2 then ctdh.SoLuong else 0 end) as
Thang2,
sum(case month(NgayDatHang) when 3 then ctdh.SoLuong else 0 end) as
11. Thang3,
sum(case month(NgayDatHang) when 4 then ctdh.SoLuong else 0 end) as
Thang4,
sum(case month(NgayDatHang) when 5 then ctdh.SoLuong else 0 end) as
Thang5,
sum(case month(NgayDatHang) when 6 then ctdh.SoLuong else 0 end) as
Thang6,
sum(case month(NgayDatHang) when 7 then ctdh.SoLuong else 0 end) as
Thang7,
sum(case month(NgayDatHang) when 8 then ctdh.SoLuong else 0 end) as
Thang8,
sum(case month(NgayDatHang) when 9 then ctdh.SoLuong else 0 end) as
Thang9,
sum(case month(NgayDatHang) when 10 then ctdh.SoLuong else 0 end) as
Thang10,
sum(case month(NgayDatHang) when 11 then ctdh.SoLuong else 0 end) as
Thang11,
sum(case month(NgayDatHang) when 12 then ctdh.SoLuong else 0 end) as
Thang12,
sum(ctdh.SoLuong) as Nam2011
from dbo.MATHANG as mh inner join dbo.CHITIETDATHANG as ctdh
on mh.MaHang = ctdh.MaHang
inner join dbo.DONDATHANG as ddh
on ctdh.SoHoaDon = ddh.SoHoaDon
where year(NgayDatHang) = 2011
group by mh.MaHang, TenHang
--2.33 Cập nhật lại giá trị 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 dbo.DONDATHANG
set NgayChuyenHang = NgayDatHang
where NgayChuyenHang is null
--2.34 Tăng số lượng hàng của những mặt hàng do công ty SAFICO cung cấp lên
gấp đôi.
update dbo.MATHANG
set SoLuong = 2*SoLuong
where MaCongTy in (
select MaCongTy
from dbo.NHACUNGCAP
where TenGiaoDich = 'SAFICO'
)
--2.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).
create view forUpdateDiaChi
as
select NoiGiaoHang, DiaChi
from dbo.DONDATHANG inner join dbo.KHACHHANG
on dbo.DONDATHANG.MaKhachHang = dbo.KHACHHANG.MaKhachHang
update forUpdateDiaChi
set NoiGiaoHang = DiaChi
12. where NoiGiaoHang is null
--2.36 Cập nhật lại dữ liệu trong bảng KHACHHANG sao cho nếu tên công ty và
tên giao dịch
-- của khách hàng trùng với tên công ty và tên giao dịch của một nhà cung cấp
-- nào đó thì địa chỉ, điện thoại, fax và e-mail phải giống nhau.
create view forUpdateInfKhachHang
as
select kh.TenCongTy as khTenCongTy ,kh.TenGiaoDich as khTenGiaoDich,kh.DiaChi
as khDiaChi,
kh.DienThoai as khDienThoai, kh.email as khEmail, kh.fax as khFax,
ncc.TenGiaoDich,ncc.DiaChi, ncc.DienThoai, ncc.email, ncc.fax
from dbo.KHACHHANG as kh inner join dbo.NHACUNGCAP as ncc
on kh.TenCongTy = ncc.TenCongTy
update forUpdateInfKhachHang
set khDiaChi = DiaChi,
khDienThoai = DienThoai,
khEmail = email,
khFax = fax
where khTenGiaoDich = TenGiaoDich
--2.37 Tăng lương lên gấp rưỡi cho những nhân viên bán được số lượng hàng
nhiều hơn 10 trong năm 2011.
update dbo.NHANVIEN
set LuongCoBan = LuongCoBan*1.5
where MaNhanVien in (
select MaNhanVien
from dbo.DONDATHANG inner join dbo.CHITIETDATHANG
on dbo.DONDATHANG.SoHoaDon = dbo.CHITIETDATHANG.SoHoaDon
where year(NgayDatHang) = 2011
group by MaNhanVien
having sum(SoLuong)>10
)
--2.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 dbo.NHANVIEN
set PhuCap = 0.5*LuongCoBan
where MaNhanVien in (
select top 3 MaNhanVien
from dbo.DONDATHANG inner join dbo.CHITIETDATHANG
on dbo.DONDATHANG.SoHoaDon = dbo.CHITIETDATHANG.SoHoaDon
group by MaNhanVien
order by sum(SoLuong)
)
--2.39 Giảm 25% lương của những nhân viên trong năm 2011 không lập được bất kỳ
đơn đặt hàng nào.
update dbo.NHANVIEN
set LuongCoBan = 0.75*LuongCoBan
where MaNhanVien not in(
select distinct MaNhanVien
from dbo.DONDATHANG
where year(NgayDatHang) = 2011
)
13. --2.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.
select dbo.DONDATHANG.SoHoaDon, sum(GiaBan*SoLuong -
GiaBan*SoLuong*MucGiamGia/100) as SOTIEN
from dbo.DONDATHANG inner join dbo.CHITIETDATHANG
on dbo.DONDATHANG.SoHoaDon = dbo.CHITIETDATHANG.SoHoaDon
group by dbo.DONDATHANG.SoHoaDon
--2.41 Xoá khỏi bảng NHANVIEN những nhân viên đã làm việc trong công ty quá 5
năm.
delete dbo.NHANVIEN
where datediff(year, NgayLamViec, getdate()) > 5
--2.42 Xoá những đơn đặt hàng trước năm 2010 ra khỏi cơ sở dữ liệu.
delete dbo.DONDATHANG
where year(NgayDatHang) < 2010
--2.43 Xoá khỏi bảng LOAIHANG những loại hàng hiện không có mặt hàng.
delete dbo.LOAIHANG
where MaLoaiHang not in(
select distinct MaLoaiHang
from dbo.MATHANG
)
--2.44 Xoá khỏi bảng KHACHHANG những khách hàng hiện không có bất kỳ đơn đặt
hàng nào cho công ty.
delete dbo.KHACHHANG
where MaKhachHang not in(
select distinct MaKhachHang
from dbo.DONDATHANG
)
--2.45 Xoá khỏi bảng MATHANG những mặt hàng có số lượng bằng 0 và không được
--đặt mua trong bất kỳ đơn đặt hàng nào.
delete dbo.MATHANG
where SoLuong = 0 and MaHang not in (
select distinct MaHang
from dbo.CHITIETDATHANG
)