/* ---TẠO STORED PROCEDURE HIỆN DỮ LIỆU (20 CÂU) ---*/
/*1. Tạo Stored Procedure có tham số truyền vào là tháng, năm cho biết những khách hàng
nào thuê phòng trong tháng đó.
--có tham số truyền vào là năm và tháng
*/
CREATE PROC [những khách hàng nào thuê phòng trong tháng đó] (@thang INT, @nam INT)
AS BEGIN
IF EXISTS(
SELECT FROM * tblChi_tiet_hoa_don_phong WHERE MONTH(sNgayThue) @thang = AND YEAR(sNgayThue) @nam=
)BEGIN
SELECT kh.sMaKH sTenKH, sGioiTinh, sSDTKH , FROM tblKhachHang kh
INNER JOIN tblHoaDon hd ON kh sMaKH = hd sMaKH. . INNER JOIN tblChi_tiet_hoa_don_phong p ON p sMaHD.
= hd.sMaHD
GROUP BY kh.sMaKH sTenKH, sGioiTinh, sSDTKH, , sNgayThue
HAVING MONTH(sNgayThue @thang ) = AND YEAR(sNgayThue) @nam=
END ELSEBEGIN
PRINT N'không có khách hàng nào thuê trong tháng
này' END
END
EXEC [những khách hàng nào thuê phòng trong tháng đó] 5, 2020
/*2. Tạo thủ tục để bổ sung thêm một bản ghi mới cho bảng [dbo].[tblNhanVien]
-có tham số truyền vào là tênnv, ngày sinh, giới tính, diachi, sdt, luong, phu cap, mapb
-với điều kiện:
+) ngày vào làm đủ 18 tuổi +) mã PB phải nhập đúng
+) Ngày vào làm phải <= Ngày hiện tại +) SDT phải có 10 hoặc 11 số
+) giới tính chỉ nhận giá trị là Nam hoặc Nu +) lương và phụ cấp phải lớn hơn 0
*/CREATE PROC [INSERTtblNhanVien] @ten ( NVARCHAR( ),20
@ngaysinh DATETIME, @gioitinh NVARCHAR(10), @diachi NVARCHAR( ),30 @sdt NVARCHAR(11), @luong FLOAT( ),2
@phucap FLOAT( ),2 @mapb INT, @ngayvaolam DATETIME) ASBEGIN
DECLARE @CHECK INT = 0
IF(DATEDIFF day( , @ngaysinh, @ngayvaolam) 365 18/ < ) BEGIN
PRINT N'chưa đủ 18 tuổi' SET @CHECK 1=
END IF NOT EXISTS(
SELECT FROM * tblBoPhanQuanLy WHERE sMaPB @mapb=
) BEGIN
PRINT N'Mã phòng ban chưa nhập đúng' SET @CHECK 1=
END
IF(@ngayvaolam > GETDATE()) BEGIN
PRINT N'Ngày vào làm phải nhỏ hơn hoặc bằng ngày hiện tại'
SET @CHECK 1= END
IF(LEN(@sdt 11 ) != ANDLEN(@sdt) != 10) BEGIN
PRINT N'Số điện thoại phải có 10 hoặc 11 chữ số' SET @CHECK 1=
END
IF(@gioitinh NOT IN ('Nam' 'Nu', )) BEGIN
PRINT N'giới tính chỉ nhận giá trị Nam hoặc Nữ' SET @CHECK 1=
END
IF(@luong 0 < OR @phucap < 0) BEGIN
PRINT N'Lương cơ bản và phụ cấp phải lớn hơn 0' SET @CHECK 1=
END IF(@CHECK 1= )
BEGIN
PRINT N'Mời bạn nhập lại' ROLLBACK
END ELSEBEGIN
INSERT INTO tblNhanVien(sTenNV, sNgaysinh , sGioiTinh, sDiaChi sSDT sLuongcb sPhuCap sMaPB , , , , ,
sNgayVaoLam)
VALUES (@ten, @ngaysinh, @gioitinh @diachi , ,
@sdt, @luong, @phucap, @mapb, @ngayvaolam) END END
EXEC [INSERTtblNhanVien] N'Đặng Thành Công','2002/5/20', 'Nam',N'thanh xuân', '0914133179', 10000000, 500000, 56, '2021/8/14'
/*3. Thêm bản ghi mới vào bảng chi tiết hóa đơn phòng với tham số truyền vào là
mã hóa đơn và chuỗi {{map1, ngaythue1, ngaytra1}, {map2, ngaythue2, ngaytra2},....}
mặc định giá phòng là giá phòng hiện tại
*/CREATE PROC [INSERTtbltblChi_tiet_hoa_don_phong] @mhd ( INT, @s NVARCHAR(1000))
ASBEGIN
IF NOT EXISTS(
SELECT FROM * tblHoaDon WHERE @mhd sMaHD= ) BEGIN
PRINT N'Mã hóa đơn nhập không đúng' RETURN
END
DECLARE @x NVARCHAR(1000)
SET @x =Replace Replace( (@s, '{','' '}' ''), , )
DECLARE contro CURSOR FOR SELECT FROM * STRING_SPLIT(@x, )','
OPEN contro
DECLARE @map NVARCHAR(10) DECLARE @ngaythue NVARCHAR(10) DECLARE @ngaytra NVARCHAR(10) FETCH NEXT FROM contro INTO @map WHILE @@FETCH_STATUS 0=
BEGIN
FETCH NEXT FROM contro INTO @ngaythue FETCH NEXT FROM contro INTO @ngaytra DECLARE @check INT = 0
IF NOT EXISTS(
SELECT FROM * tblPhong
WHERE CAST(@map AS INT) sMaP= )BEGIN
PRINT N'Không có phòng nào có mã phòng là ' + @map
SET @check 1 = END
IF(@ngaythue @ngaytra> ) BEGIN
PRINT N'Ngày thuê phải trước hoặc bằng ngày trả '
SET @check 1 = END
IF(@check 0= ) BEGIN
DECLARE @giap FLOAT(2)
SELECT @giap = sGiaP FROM tblPhong
WHERE @map sMaP= INSERT INTO
tblChi_tiet_hoa_don_phong
VALUES (CAST(@map AS INT), @mhd, CAST(@ngaythue AS DATETIME), CAST(@ngaytra AS
DATETIME), @giap ) END
FETCH NEXT FROM contro INTO @map CLOSE controEND
DEALLOCATE contro END
EXEC dbo.INSERTtbltblChi_tiet_hoa_don_phong 6, '{{4,2021/8/10,2021/8/15},{18,2021/8/10,2021/8/15}}'
--4. Tạo thủ tục thống kê tổng số hoá đơn đã lập của nhân viên có tên MNV truyền vào
CREATE OR ALTER PROC [tổng số hoá đơn đã lập của nhân viên] (@tennv NVARCHAR( ))20
ASBEGIN
IF EXISTS (
SELECT FROM * tblNhanVien WHERE sTenNV @tennv= )BEGIN
SELECT COALESCE COUNT( (*), ) 0 AS [tổng số hoá đơn đã lập] FROM tblNhanVien
INNER JOIN tblHoaDon ON tblNhanVien.sMaNV = tblHoaDon.sMaNV
WHERE sTenNV @tennv= ENDELSE
BEGIN
PRINT N'không có nhân viên tên '+ @tennv ENDEND
EXEC [tổng số hoá đơn đã lập của nhân viên] N'Đặng Thành Công'
/*
5. Tạo thủ tục có tham số truyền vào là tên loại dv, cho biết những khách hàng nào đã dùng loại dv này
*/
CREATE OR ALTER PROC [những khách hàng đã dùng loại dv]
(@tenloai NVARCHAR( ))20 AS
BEGIN
IF EXISTS (
SELECT FROM * tblLoaiDV WHERE sTenLoai = @tenloai ) BEGIN
SELECT kh.sMaKH sTenKH, sGioiTinh, sSDTKH , FROM tblKhachHang kh
INNER JOIN tblHoaDon hd ON kh sMaKH = . hd.sMaKH
INNER JOIN tblChi_tiet_hoa_don_dv cdv ON cdv.sMaHD hd= .sMaHD
INNER JOIN tblDichVu dv ON dv sMaDV . = cdv.sMaDV
INNER JOIN tblLoaiDV ldv ON ldv sMaLoai . = dv.sMaLDV
WHERE ldv sTenLoai @tenloai. =
GROUP BY kh.sMaKH sTenKH, sGioiTinh, , sSDTKH
END ELSEBEGIN
PRINT N'Không có loại dịch vụ này' END
END
EXEC [những khách hàng đã dùng loại dv] N' Ăn uống'
/*
6. Tạo thủ tục có tham số truyền vào là tên dịch vụ, cho biết có bao nhiêu khách hàng sử dụng dv trên
*/
CREATE PROC [tổng số khách hàng sử dụng dv] @tendv ( NVARCHAR( ))20
AS BEGIN
SELECT COUNT(kh.sMaKH) AS [tổng số KH] FROM tblKhachHang kh
WHERE kh.sMaKH IN (
SELECT sMaKH FROM tblHoaDon hd INNER JOIN tblChi_tiet_hoa_don_dv cdv ON cdv.sMaHD hd= .sMaHD
INNER JOIN tblDichVu dv ON dv sMaDV cdv.sMaDV . = WHERE dv sTenDV @tendv. =
GROUP BY sMaKH END)
EXEC [tổng số khách hàng sử dụng dv] N' Nhà hàng'
/*
7. Tạo thủ tục cho biết danh sách nhân viên đã lập hoá đơn trong ngày(năm/tháng/ngày) là
tham số truyền vào
*/CREATE OR ALTER PROC [cho biết danh sách nhân viên đã lập hoá đơn trong ngày] @ngay ( DATE)
AS
BEGIN
SELECT nv.sMaNV, sTenNV sNgaysinh, sNgayVaoLam , , sSDT, sDiaChi FROM tblNhanVien nv
INNER JOIN tblHoaDon hd ON nv.sMaNV = hd sMaNV. WHERE sNgayLap = @ngay
END
EXEC [cho biết danh sách nhân viên đã lập hoá đơn trong ngày]
'2020/10/28'
/*8. Tạo thủ tục tăng lương lên gấp rưỡi cho Nhân viên làm việc trên 5 năm.
*/CREATE PROC [tăng lương lên gấp rưỡi cho Nhân viên làm việc trên 5 năm]
ASBEGIN
UPDATE tblNhanVien SET sLuongcb *= 1.5
WHERE DATEDIFF day( , sNgayVaoLam, GETDATE()) / 365 >
5
ENDEXEC [tăng lương lên gấp rưỡi cho Nhân viên làm việc trên 5 năm]
/*--9. Tạo thủ tục lấy ra danh sách nhân viên theo giới tính và theo tuổi
- tuổi và giới tính truyền vào
*/
CREATE PROC [lấy ra danh sách nhân viên theo giới tính và tuổi](@gioitinh NVARCHAR( ), @tuoi INT)3
AS
BEGIN
SELECT FROM * tblNhanVien
WHERE sGioiTinh @gioitinh = AND DATEDIFF day( , sNgaysinh, GETDATE()) / 365 = @tuoi
END
EXEC [lấy ra danh sách nhân viên theo giới tính và tuổi] 'Nu', 24
/*--10 Tạo thủ tục tính tổng tiền thu được trong năm truyền vào
*/CREATE PROC tong_tien @nam ( INT) ASBEGIN
DECLARE @tongt FLOAT(2) = 0
SELECT @tongt += SUM(dv.sGiaNiemYet sSoLuong) * FROM tblHoaDon hd
INNER JOIN tblChi_tiet_hoa_don_dv dv ON hd.sMaHD = dv sMaHD.
WHERE YEAR( .hd sNgayLap @nam ) =
SELECT @tongt += SUM(hp.sGiaPhong DATEDIFF day* ( , sNgayThue, sNgayTra)) FROM tblHoaDon hd
INNER JOIN tblChi_tiet_hoa_don_phong hp ON hd.sMaHD = hp sMaHD.
WHERE YEAR( .hd sNgayLap @nam ) =
PRINTN'Tổng tiền thu được trong năm '+ CAST(@nam AS NVARCHAR( )) +10 N' là: '+ CAST(@tongt AS NVARCHAR(30)) ENDEXEC dbo.tong_tien 2019
/*
11. tạo thủ tục tăng phụ cấp nhân viên lập được nhiều hóa đơn nhất lên 500000
*/
CREATE PROC [tangpc]
ASBEGIN
UPDATE tblNhanVien SET sPhuCap 5000000= WHERE sMaNV IN (
SELECT sMaNV FROM tblHoaDon GROUP BY sMaNV
HAVING COUNT(sMaHD ) >= (SELECT MAX(tong) FROM(
SELECT COUNT(sMaHD) AS tong FROM tblHoaDon
GROUP BY sMaNV ) ) a
END)
EXEC [tangpc]
/*12. Viết thủ tục:
-- Tham số truyền vào: mã loại phòng
-- Thực hiện tăng giá phòng lên gấp rưỡi cho những phòng thuộc loại phòng
truyền vào
*/
CREATE PROC [tăng giá phòng lên gấp rưỡi] (@maloai NVARCHAR( ))10
ASBEGIN
UPDATE tblPhong SET sGiaP *= 1.5
WHERE @maloai = sLoaiP END
EXEC dbo.[tăng giá phòng lên gấp rưỡi] N'hangA'
/*13. Tạo thủ tục thêm bản ghi khách hàng tham số truyền vào tương ứng
*/CREATE PROC [INSERTtblKhachHang] @ten ( NVARCHAR(20) ,
@gioiTinh NVARCHAR( ),3 @cccd NVARCHAR( ),11 @sdt NVARCHAR( ))11
AS BEGIN
DECLARE @CHECK INT = 0
IF(LEN(@sdt 11 ) != ANDLEN(@sdt) != 10) BEGIN
PRINT N'Số điện thoại phải có 10 hoặc 11 chữ số' SET @CHECK 1=
END
IF(@gioitinh NOT IN ('Nam' 'Nu', )) BEGIN
PRINT N'giới tính chỉ nhận giá trị Nam hoặc Nữ' SET @CHECK 1=
END
IF(LEN(@cccd) 11!= ) BEGIN
PRINT N'Căn cước công dân phải đủ 11 chữ số' SET @CHECK 1=
END IF(@CHECK 1= )
BEGIN
PRINT N'Mời bạn nhập lại' ROLLBACK
ELSEEND
BEGIN
INSERT INTO tblKhachHang(sTenKH, sGioiTinh , sCCCD, sSDTKH)
VALUES (@ten, @gioiTinh @cccd @sdt, , ) END
END
EXEC dbo.INSERTtblKhachHang 'zzcongkunzz' 'Nam', , '01234567899' '0359872564',
/*
14. tạo thủ tục thêm hóa đơn tham số truyền vào tương ứng
*/CREATE PROC [INSERTtblHoaDon] @makh ( INT, @manv INT,
@ngaylap DATETIME) ASBEGIN
DECLARE @check INT = 0 IF NOT EXISTS(
SELECT FROM * tblNhanVien WHERE @manv sMaNV= ) BEGIN
PRINT N'Mã nhân viên nhập không đúng' SET @check 1=
END
IF NOT EXISTS(
SELECT FROM * tblKhachHang WHERE @makh sMaKH= ) BEGIN
PRINT N'Mã khách hàng nhập không đúng' SET @check 1=
END
IF (@ngaylap > GETDATE())
BEGIN
PRINT N'ngày lập hóa đơn phải trước hoặc bằng ngày hiện tại'
SET @check 1= END
IF(@CHECK 1= ) BEGIN
PRINT N'Mời bạn nhập lại' ROLLBACK
END ELSEBEGIN
INSERT INTO tblHoaDon(sMaKH, sMaNV , sNgayLap)
VALUES (@makh, @manv @ngaylap, ) END END
EXEC dbo.INSERTtblHoaDon 458, 374 ,'2021/8/14'
/*15. tạo thủ tục thêm dịch vụ với tham số truyền vào tương ứng
*/CREATE PROC [INSERTtblDichVU] @tendv ( NVARCHAR(20), @gia FLOAT(2), @maloai INT)
ASBEGIN
DECLARE @check INT = 0 IF(@gia <= ) 0
BEGIN
PRINT N'Giá phải lớn hơn 0' SET @check 1=
END IF NOT EXISTS(
SELECT FROM * tblLoaiDV WHERE @maloai = sMaLoai ) BEGIN
PRINT N'Không có loại dịch vụ nào' SET @check 1=
END IF(@CHECK 1= )
BEGIN
PRINT N'Mời bạn nhập lại' ROLLBACK
ELSEEND BEGIN
INSERT INTO tblDichVu
VALUES (@tendv, @gia, @maloai) END END
EXEC dbo.INSERTtblDichVU '4s', 1000000, 424
/*16. Thêm bản ghi mới vào bảng chi tiết dịch vụ với tham số truyền vào dạng chuỗi {{madv1, so luong},{madv2, so luong}, ...}
và mã Hóa đơn mặc định giá niêm yết là 110% giá dv
*/CREATE PROC [INSERTtbltblChi_tiet_hoa_don_dv](@mhd INT,
@s NVARCHAR(1000)) ASBEGIN
IF NOT EXISTS(
SELECT FROM * tblHoaDon WHERE @mhd sMaHD= ) BEGIN
PRINT N'Mã hóa đơn nhập không đúng'
RETURN END
DECLARE @x NVARCHAR(1000)
SET @x =Replace Replace( (@s, '{','' '}' ''), , ) DECLARE contro CURSOR FOR SELECT FROM * STRING_SPLIT(@x, )','
OPEN contro
DECLARE @madv NVARCHAR(10) FETCH NEXT FROM contro INTO @madv WHILE @@FETCH_STATUS 0=
BEGIN
DECLARE @sl INT
FETCH NEXT FROM contro INTO @sl IF NOT EXISTS(
SELECT FROM * tblDichVu WHERE CAST(@madv AS INT) = sMaDV
) BEGIN
PRINT N'Không có dịch vụ nào có mã là ' @madv+
END ELSEBEGIN
DECLARE @giany FLOAT( )2 SELECT @giany sGiaDV = * 1.1 FROM tblDichVu
WHERE @madv sMaDV= INSERT INTO
tblChi_tiet_hoa_don_dv
VALUES (@mhd, CAST(@madv AS INT), @sl, @giany)
FETCH NEXT FROMEND contro INTO @madv END
CLOSE contro DEALLOCATE contro END
EXEC dbo.INSERTtbltblChi_tiet_hoa_don_dv 6,'{{80,10},{95, 2}}'
/*17. Tạo thủ tục thống kê số lượng nhân viên của từng phòng ban
*/CREATE PROC [số lượng nhân viên của từng phòng ban]
ASBEGIN
SELECT sTenPB, COUNT(*)AS [số nhân viên] FROM tblBoPhanQuanLy ql
LEFT JOIN tblNhanVien nv ON ql sMaPB nv.sMaPB. = GROUP BY ql.sMaPB, ql.sTenPB
ENDEXEC [số lượng nhân viên của từng phòng ban]
/*
18. tạo thủ tục tính số phòng của từng loại phòng
*/
CREATE PROC [số phòng của từng loại phòng]
ASBEGIN
SELECT sLoaiP ,COUNT(sMaP) AS [số lượng] FROM tblPhong
GROUP BY sLoaiP ORDER BY COUNT(sMaP) END
EXEC [số phòng của từng loại phòng]
/*19. Tạo thủ thục thêm phòng với tham số truyền vào là loại phòng, giáp và số lượng phòng muốn thêm
*/CREATE PROC [INSERTtblPhong] @loaip ( NVARCHAR( ),10 @gia FLOAT(2), @sl INT)
ASBEGIN
DECLARE @i INT = 0
IF (@loaip != 'HangA' AND @loaip !='HangB'AND @loaip
!= 'HangC') BEGIN
PRINT N'Loại phòng chỉ nhận giá trị HangA hoặc HangB hoặc HangC'
RETURN WHILE(END@i @sl< ) BEGIN
INSERT INTO tblPhong VALUES (@loaip, @gia) SET @i += 1
ENDEND
EXEC dbo.INSERTtblPhong 'HangA', 150000, 10
/*
20. tạo PROC lấy ra khách hàng đã chi tiêu số tiền lớn hơn hoặc bằng số tiền truyền vào
*/
CREATE PROC [KH_tiềm_năng](@tt FLOAT( ))2 ASBEGIN
SELECT sTenKH sGioiTinh sSDTKH , , FROM tblHoaDon hd INNER JOIN tblKhachHang kh ON hd.sMaKH kh sMaKH= . LEFT JOIN (
SELECT sMaHD ,SUM(sGiaNiemYet * sSoLuong) AS [ttdv] FROM tblChi_tiet_hoa_don_dv cdv
GROUP BY sMaHD ) a ON a.sMaHD = hd sMaHD. LEFT JOIN (
SELECT sMaHD ,SUM(sGiaPhong * DATEDIFF day( , sNgayThue, sNgayTra)) AS [ttp] FROM
tblChi_tiet_hoa_don_phong cp GROUP BY sMaHD ) b ON b.sMaHD = hd sMaHD. GROUP BY sTenKH, sGioiTinh sSDTKH,
HAVING SUM ISNULL(( (ttdv, 0) +ISNULL( , ))) >=ttp 0 @tt END
EXEC dbo.KH_tiềm_năng 100000000