Bài Tập Tuan 3 -Viết View Tuan 4 -Viết Cursor Tuan 5 -Viết SP Tuan 6 -Viết Trigger Tuan 7-Viết Function ---VIEW---Tuần 3 câu 1 --Cho biết danh số xuất từng mặt hàng trong 6 tháng đầu nă
Trang 1Bài Tập
Tuan 3 -Viết View
Tuan 4 -Viết Cursor
Tuan 5 -Viết SP
Tuan 6 -Viết Trigger
Tuan 7-Viết Function
-VIEW -Tuần 3
câu 1
Cho biết danh số xuất từng mặt hàng trong 6 tháng đầu năm create view cau_1
as
select TENMH,sum(DONGIAXUAT*SOLUONGXUAT) as [DOANH THU] from HOA_DON_XUAT HD,CHI_TIET_XUAT CT,MAT_HANG MH
where HD.SOHDX=CT.SOHDX
and CT.MAMH=MH.MAMH and year(getdate())=year(NGAYXUAT) and month(NGAYXUAT)between 1 and 6 group by TENMH
- câu 2
Cho biết mặt hàng có doanh số lớn nhất
create view cau_2
as
select TENMH,sum(DONGIAXUAT*SOLUONGXUAT) as [MAX DOANH THU]
from MAT_HANG MH,CHI_TIET_XUAT CT
where MH.MAMH=CT.MAMH
group by TENMH
having sum(DONGIAXUAT*SOLUONGXUAT)>=all(select
sum(DONGIAXUAT*SOLUONGXUAT)
from MAT_HANG MH,CHI_TIET_XUAT CT
where MH.MAMH=CT.MAMH
group by TENMH)
câu 3
Cho biết những mặt hàng có doanh thu lớn hơn 1b
create view cau_3
as
select TENMH,sum(DONGIAXUAT*SOLUONGXUAT) as [DOANH THU]
Trang 2from MAT_HANG MH,CHI_TIET_XUAT CT
where MH.MAMH=CT.MAMH
group by TENMH
having sum(DONGIAXUAT*SOLUONGXUAT)>1000000000
-câu 4
Cho biết đơn giá nhập trung bình của từng mặt hàng
create view cau_4
as
select TENMH,avg(DONGIANHAP) as [ĐƠN GIÁ NHẬP TB]
from MAT_HANG MH,HOA_DON_NHAP HD,CHI_TIET_NHAP CT
where HD.SOHDN=CT.SOHDN
and MH.MAMH=CT.MAMH group by TENMH
-câu 5
Cho biết thành tiền của từng mặt hàng theo từng hoá đơn và tổng tiền của từng hoá đơn
câu 6
Cho biết thông tin nhân viên chưa nhập hàng bao giờ
create view cau_6
as
select *
from NHAN_VIEN
where MANV not in (select MANV
from HOA_DON_NHAP) -câu 7
Cho biết những mặt hàng nhập chưa bao giờ bán
create view cau_7
as
select *
from MAT_HANG
where MAMH not in (select MAMH
from HOA_DON_NHAP)
-câu 8
Cho biết những nhà cung cấp cung ứng những mặt hàng giống nhà cung cấp 1
create view cau_8
as
select TENNCC
Trang 3from NHA_CUNG_CAP NCC,CHI_TIET_NHAP CT,MAT_HANG MH
where NCC.MANCC=MH.MANCC
and MH.MAMH=CT.MAMH and MH.MAMH in (select MAMH
from NHA_CUNG_CAP NCC,MAT_HANG MH
where NCC.MANCC=MH.MANCC and NCC.MANCC=1)
câu 9(hỏi lại)
Tạo và mã hoá view : cho biết những mặt hàng chưa được xuất trong năm hiện tại
create view cau_9
with encryption as
select TENMH
from MAT_HANG
where MAMH in (select MH.MAMH
from MAT_HANG MH,HOA_DON_XUAT HD,CHI_TIET_XUAT CT
where MH.MAMH=CT.MAMH and HD.SOHDX=CT.SOHDX and NGAYXUAT=year(getdate()))
câu 10
Cho biết danh sách mặt hàng thuộc loại 1 có sử dụng WITH CHECK OPTION Sau đó chèn thử 1 bảng ghi vào view này
create view cau_10
as
select *
from MAT_HANG
where MAMH=1
with check option
insert into cau_10 values(0,1,N'MẶT HÀNG 1',N'TẤN',N'GOOD') select * from cau_10
-CURSOR -Tuần 4
câu 1
Viết một đoạn lệnh sử dụng con trỏ để hiển thị danh sách khách hàng Nếu khách hàng đã mua 10 lần thì thông báo được khuyến mại 100 USD, mua 20 lần khuyến mại 200 USD
Distinct: bo nhug ket qua trug nhau
Trang 4khai báo biến cục bộ
declare @MAKH char(6),@solan tinyint
khai báo biến cursor
declare cur_khuyenmai cursor
dynamic
for
select distinct MAKH from HOA_DON_XUAT
mở cursor
open cur_khuyenmai
đọc dữ liệu
fetch first from cur_khuyenmai into @MAKH
while @@fetch_status=0
begin
select @solan=count(*)
from HOA_DON_XUAT
where @MAKH=MAKH
select * from KHACH_HANG where @MAKH=MAKH
if @solan>=3
print 'Khách hàng: '+@MAKH+'được khuyến mãi 20% vì đã mua: '+cast(@solan as char(3))+'lần'
else
print 'Khách hàng: '+@MAKH+'được khuyến mãi 10% vì đã mua: '+cast(@solan as char(3))+'lần'
fetch next from cur_khuyenmai into @MAKH
end
đóng cursor
close cur_khuyenmai
deallocate cur_khuyenmai
-câu 2
Thêm một thuộc tính trong So_MH_CC kiểu dữ liệu số nguyên trong bảng NhaCungCap để lưu số lượng mặt hàng mà công ty đó cung cấp Viết cursor cập nhật cho thuộc tính này
alter table NHA_CUNG_CAP add SO_MH_CC int
declare @MANCC char(6),@SO_MH_CC int
declare cur_SLMH cursor
forward_only
for
select MANCC
from NHA_CUNG_CAP
open cur_SLMH
fetch next from cur_SLMH into @MANCC
Trang 5while @@fetch_status=0
begin
select SO_MH_CC=sum(SOLUONGNHAP)
from NHA_CUNG_CAP NCC,MAT_HANG MH,CHI_TIET_NHAP CTN
where NCC.MANCC=MH.MANCC
and CTN.MAMH=MH.MAMH and @MANCC=NCC.MANCC print 'Đang cập nhật nhà cung cấp:'+@MANCC
update NHA_CUNG_CAP
set SO_MH_CC=@SO_MH_CC
where MANCC=@MANCC
print 'Đang đọc'
fetch next from cur_SLMH into @MANCC
end
close cur_SLMH
deallocate cur_SLMH
câu 3
Thêm thuộc tính TongMH trong bang HoaDonNhap lưu thông tin tổng số mặt hàng đã bán trong đơn hàng Viết cursor cập
nhật thông tin cho thuộc tính này
alter table HOA_DON_NHAP add TONGMH int
declare @SOHDN char(6),@TONGMH int
declare cur_TMH cursor
forward_only
for
select distinct MAMH from MAT_HANG
open cur_TMH
fetch next from cur_TMH into @SOHDN
while @@fetch_status=0
begin
select TONGMH=sum(SOLUONGNHAP)
from MAT_HANG MH,CHI_TIET_NHAP CTN,HOA_DON_NHAP HDN
where MH.MAMH=CTN.MAMH
and HDN.SOHDN=CTN.SOHDN and @SOHDN=HDN.SOHDN print 'Dang cap nhat MAMH:'+@SOHDN
update HOA_DON_NHAP
set TONGMH=@TONGMH
where SOHDN=@SOHDN
fetch next from cur_TMH into @SOHDN
end
close cur_TMH
deallocate cur_TMH
Trang 6-câu 4
Thêm thuộc tính TongTT trong bang HoaDonXuat lưu thông tin tổng thành tiền trong hóa đơn xuất Viết cursor cập nhật
thông tin cho thuộc tính này
alter table HOA_DON_XUAT add TONGTT int
declare @SOHDX char(6),@TONGTT int
declare cur_TONGTT cursor
dynamic
for
select distinct SOHDX from HOA_DON_XUAT
open cur_TONGTT
fetch next from cur_TONGTT into @SOHDX
while @@fetch_status=0
begin
select TONGTT=sum(DONGIAXUAT*SOLUONGXUAT)
from CHI_TIET_XUAT
where @SOHDX=SOHDX
print 'Dang cap nhap phieu xuat'+@SOHDX
update HOA_DON_XUAT
set TONGTT=@TONGTT
where @SOHDX=SOHDX
print 'Dang doc'
fetch next from cur_TONGTT into @SOHDX
end
close cur_TONGTT
deallocate cur_TONGTT
-Viet Giao Dich
1 Tạo một giao dịch đảm bảo thực hiện thành công 2 công việc: Xóa loại hàng ‘L01’
trong bảng tblLoaihang; thêm 1 bản ghi vào tblHanghoa Nếu một trong bị lỗi thì hủy
cả 2 công việc đi và thông báo lỗi
2 Xây dựng giao dịch đảm bảo việc xuất của một hàng hóa bất
kỳ không vượt quá số
lượng tồn còn lại
-SP -Tuan5
cau 1: Nhập vào tháng và năm bất kỳ cho biết thông tin những mặt hàng bán trong
tháng đó.
drop proc sp_thangnam
create proc sp_thangnam
Trang 7@thang int, @nam int as
select *
from ChiTietHoaDon c, HoaDonXuat h, mathang mh
wheremonth(NgayHD)=@thang
and year (NgayHD)=@nam
and c.mahd =h.mahd
and mh.mamh =c.mamh
- cau 2: nhap vao 1 quy cho biet nhung mat hang nao ban nhieu nhat trong qui do
create proc sp_nhieunhat
@quy tinyint
as
begin tran
if @quy <=4
select sum(soluong) as [Tong so luong],mh.tenmh
from ChiTietHoaDon c, HoaDonXuat h, mathang mh
wheredatepart("q",ngayHD)=@quy
and c.mahd =h.mahd
and mh.mamh =c.mamh
group by mh.mamh, tenmh
having sum(soluong)>=all(
select sum(soluong) from ChiTietHoaDon c, HoaDonXuat h, mathang mh
where datepart("q",ngayHD)=@quy
and c.mahd =h.mahd and mh.mamh =c.mamh group by mh.mamh
) else
print 'ko co quy nay'
if @@error <>0
rollback tran
else
commit tran
- cau 3: Nhập vào SoHDB (số hóa đơn bán) cho biết thông tin những mặt hàng của
những hóa đơn bán đó.
Trang 8drop proc sp_SoHD
create proc sp_SoHD
@sohd char(5) as
select *
from ChiTietHoaDon c, HoaDonXuat h, mathang mh
whereh.mahd=@sohd
and c.mahd =h.mahd
and mh.mamh =c.mamh
cau 4:
Thêm mặt hàng vào bảng MatHang thỏa mãn các ràng buộc sau: a Kiểm tra khóa chính
b Kiểm tra khóa ngoại liên quan
c Đơn vị tính là một trong những loại: “cái, thùng,
chiếc, lon, chai, mét, kg,
tấn”.
create proc sp_themmh
@mamh char(5), @tenmh varchar(30), @dvt char(7) as
begin tran
if exists (select * from mathang where mamh=@mamh)
print 'ma hang ' + @mamh + ' da ton tai' else
if @dvt not in ('cai','thung','chiec')
print 'dvt phai nam trong nhung tu <cai, thung, chiec>'
else insert into mathang values (@mamh,@tenmh,@dvt)
if @@error <>0
rollback tran
else
commit tran
- cau 5: Thêm vào bảng ChiTietHDB thỏa mãn các ràng buộc sau:
a Kiểm tra khóa chính
b Kiểm tra khóa ngoại
c Số lượng hóa đơn bán phải dương và đồng thời nhỏ hơn hay bằng số
lượng tồn trong kho
Trang 9d Đơn giá bán phải lớn hơn hay bằng đơn giá nhập lớn nhất của các lần
nhập.
- Cau 6: Thêm vào bảng hóa đơn bán thỏa mãn các ràng buộc sau:
a Số hóa đơn là số thứ tự của các hóa đơn có trong hệ
thống bắt đầu từ 1
Khi thêm mới phải kiểm tra có những số thứ tự bị xóa thì phải
bổ sung
vào những số thứ tự còn trống này; nếu không có (nghĩa là những số thứ
tự liên tục với nhau) thì thêm với số thứ tự tiếp theo
b Kiểm tra khóa ngoại
c Ngày bán phải nhỏ hơn hay bằng ngày hiện tại.
- Cau 7: Cập nhật số lượng bán như sau:
a Nếu không còn hàng trong kho thì không cập nhật số lượng bán
b Nếu còn hàng trong kho thì cập nhật cập nhật số lượng bán phải nhỏ hơn
hay bằng hàng trong kho.
- Cau 8: Xóa hóa đơn bán hàng kiểm tra các ràng buộc như sau
a Hóa đơn không có mặt hàng nào bán thì xóa
b Hóa đơn có mặt hàng rồi thì không xóa.
-Funtion -tuan 6
cau1
Đầu vào: MaMH, ngày 1, ngày 2 Đầu ra: tổng số lượng hàng
đã bán của mặt
hàng đó trong khoảng từ ngày 1 đến ngày 2
create proc sp_slhang
@mamh char(10), @tungay datetime,@denngay datetime,
@slhang int output
as
begin tran
Trang 10select @slhang=sum(soluong)
from chitiethoadon ct,hoadonxuat hdx
where ct.mahd=hdx.mahd
and ngayhd between @tungay and @denngay
and @mamh=mamh
if @@error =0
commit tran
else
rollback tran
select * from hoadonxuat
declare @sl int
exec sp_slhang'mh01','1/3/2010',@slhang=@sl
print 'hang ban dc trong thang 1/3/2010 den 1/4/2010'+ @sl
-cau 2
Đầu vào: Ten_NCC, kiểm tra nhà cung cấp đó có tồn tại không Đầu ra: tổng số
lượng mặt hàng mà nhà cung cấp đó đã cung ứng
create proc sp_slhang
@mancc char(50),
@slh int output
as
begin tran
if(exists(select * from nha_cung_cap where mancc=@mancc)
select @slh=sum(mh.mamh)
from nha_cung_cap ncc,mathang mh
where mh.mancc=ncc.mancc
and ncc.mancc=@mancc
if @@error=0
commit tran
else
rollback tran
select *from chitiethoadon
declare @sl int
exec sp_slhang'mh01','1/3/2010',@slh=@sl
print 'nha cung cap da ton tai'+ @sl
Trang 11
-cau 3
Đầu vào MAKH Kiểm tra mã khách hàng đó có tồn tại không Đầu ra, tổng số
lần mua và tổng trị giá trên các lần mua hàng của khách hàng
select * from khachhang
select * from hoadonxuat
create proc sp_tonglanmua
@makh char(5),@ttkh char(15),
@slmua int output,
@tongt int output
as
begin tran
if(exists(select * from khachhang where makh=@makh)) kiem tra ton tai
select @slmua=count(hd.mahd),@tongt=sum(tongtien) from hoadonxuat hd,khachhang kh,chitiethoadon ct
where hd.mahd=ct.mahd and kh.makh=hd.makh
and @makh=kh.makh
if @@error=0
commit tran else
rollback tran
-cau 4
Đầu vào: MaMH Đầu ra: số lượng tồn của mặt hàng đó
select * from mathang
select * from hoadonxuat
select * from chitiethoadon
create proc sp_slton
@mamh char(5),
@slton int output
as
begin tran
select @slton
from mathang mh
where hd.mahd=ct.mahd
Trang 12- Cau :5 Đầu vào: MaMH Đầu ra đơn giá nhập và đơn giá bán của mặt hàng đó.
- Cau 6: Đầu vào: tháng và năm bất kỳ Kiểm tra tháng và năm đó phải nhỏ hơn hay bằng
tháng năm hiện tại Đầu ra, tính tiền lời cho thời gian đó (tiền lời = Sum(số
lượng nhập * đơn giá nhập) – Sum(số lượng xuất * đơn giá xuất))
Cau 7: Dùng giao tác viết lại các câu store procedure trên:
thuc hang tuan 7 trigger
cau 1
moi mat hang phai co mot ma duy nhat de phan biet mat hang nay voi mat hang khac
drop trigger trig_masp
create trigger trig_masp
on mat_hang
for insert,update
as
if(select count(*) from inserted ins , mat_hang mh where ins.mamh = mh.mamh)>1
begin print' ma mat hang da ton tai' rollback tran
end
-cau 2 nhan vien phai co tuoi >= 18 va neu nhan vien co so nam cong tac >=2 thi duoc tinh la nhan vien bien che con <2 nam thi tinh la nhan vien hop dong
select * from nhan_vien
drop trigger bienche
create trigger bienche
on nhan_vien
for insert
as
if not exists (select * from nhan_vien nv,inserted d where nv.manv = d manv and
year(getdate()) - year(d.ngaysinh) > 18)
Trang 13begin print ' nhan vien khong du dieu kiem lam ' rollback tran
end
if exists (select * from inserted d where year(getdate()) - year(d.ngayvaolam) <2)
if exists (select * from inserted where loaihinh ='bien che') begin
print ' ban khong the nhap loai hinh la bien che' rollback tran
return end
if exists (select * from inserted d where year(getdate()) - year(d.ngayvaolam) >2)
if exists (select * from inserted where loaihinh ='hop dong ') begin
print ' ban khong the nhap loai hinh la hop dong ' rollback tran
return end
-cau 3 don gia ban cua mot san pham phai lon hon don gia nhap cua san pham do trong thoi gian ngay gan nhat
select * from hoa_don_nhap
select * from chi_tiet_nhap
drop trigger trig_dongia
create trigger trig_dongia
on chi_tiet_xuat
for insert
as
if not exists (select * from chi_tiet_nhap ct, inserted d where ct.mamh = d.mamh)
begin print ' san pham khong ton tai ' rollback tran
end
if not exists (select dongiaxuat from inserted where dongiaxuat >(
select dongianhap from hoa_don_nhap hd, chi_tiet_nhap ct, inserted i
where hd.sohdn = ct.sohdn and ct.mamh =i.mamh and ngaynhap>= (
Trang 14select max(ngaynhap)
from hoa_don_nhap hd, chi_tiet_nhap ct, inserted i
where hd.sohdn = ct.sohdn and ct.mamh =i.mamh))) begin
print 'gia nhap khong dung' rollback tran
end
-cau 4 mot mat hang phai thuoc mot loai hang nhat dinh
select * from loai_hang
alter table mat_hang drop constraint FK_MATHANG_NHACUNGCAP
select * from mat_hang
create trigger trig_thuocloaihang
on mat_hang
for insert
as
if not exists (select * from loai_hang lh, inserted d where d.maloai = lh.maloai)
begin print ' ma loai hang nay chua ton tai ' rollback tran
end
-cau 5 moi hoa don nhap phai co it nhat mot mat hang
drop trigger trig_donhang
create trigger trig_donhang
on hoa_don_nhap
as
if not exists (select count(d.mamh)>0 from hoa_don_nhap dh,chi_tiet_nhap ct, inserted d where xt.mamh = d.mamh and hd.sohdn = ct.sohdn)
begin print ' moi hoa don nhap phai co it nhat mot mat hang ' rollback tran
end