-------------NHOM23----------------------------- CREATE DATABASE NHOM23_QLDA USE NHOM23_QLDA drop database NHOM23_QLDA -- ============================================= -- 1. Tạo bảng PHONGBAN (Phòng ban) -- ============================================= CREATE TABLE PHONGBAN( MAPB CHAR(10) PRIMARY KEY NOT NULL, TENPB NVARCHAR(50) NOT NULL, SONV INT ); -- ============================================= -- 2. Tạo bảng CHUCVU (Chức vụ) -- ============================================= CREATE TABLE CHUCVU( MACVU CHAR(10) PRIMARY KEY NOT NULL, TENCVU NVARCHAR(50) NOT NULL ); -- ============================================= -- 3. Tạo bảng NHANVIEN (Nhân viên) -- ============================================= CREATE TABLE NHANVIEN( MANV CHAR(10) PRIMARY KEY NOT NULL, MAPB CHAR(10) NOT NULL REFERENCES PHONGBAN(MAPB), MACVU CHAR(10) NOT NULL REFERENCES CHUCVU(MACVU), TENNV NVARCHAR(50) NOT NULL, GIOITINH NVARCHAR(10), SOCCCD VARCHAR(15) NOT NULL, DIACHI NCHAR(50), EMAIL VARCHAR(50), DIENTHOAI VARCHAR(15) ); -- ============================================= -- 4. Tạo bảng KHACHHANG (Khách hàng) -- ============================================= CREATE TABLE KHACHHANG( MAKH CHAR(10) PRIMARY KEY NOT NULL, TENKH NVARCHAR(50) NOT NULL, SOCCCD VARCHAR(15) NOT NULL, DIACHI NVARCHAR(50), EMAIL VARCHAR(50), DIENTHOAI VARCHAR(15) ); -- ============================================= -- 5. Tạo bảng DUAN (DỰ ÁN) -- ============================================= CREATE TABLE DUAN( MADA CHAR(10) PRIMARY KEY NOT NULL, TENDA NVARCHAR(50) NOT NULL, MAKH CHAR(10) NOT NULL REFERENCES KHACHHANG(MAKH), NGAYBD DATE, NGAYKTDUKIEN DATE, NGAYKTTHUCTE DATE, TIENDO NVARCHAR(50) ); -- ============================================= -- 6. Tạo bảng CONGVIEC (CÔNG VIỆC) -- ============================================= CREATE TABLE CONGVIEC( MACV CHAR(10) PRIMARY KEY NOT NULL, TENCV NVARCHAR(50) NOT NULL, MADA CHAR(10) NOT NULL REFERENCES DUAN(MADA), NGAYGIAO DATE, DEADLINE DATE, NGAYHT DATE, TRANGTHAI NVARCHAR(50) ); -- ============================================= -- 7. Tạo bảng PHANCONGCV (PHÂN CÔNG CÔNG VIỆC) -- ============================================= CREATE TABLE PHANCONGCV( MAPHANCONG CHAR(10) NOT NULL PRIMARY KEY , MADA CHAR(10) NOT NULL REFERENCES DUAN(MADA), MACV CHAR(10) NOT NULL REFERENCES CONGVIEC(MACV), MANV CHAR(10) NOT NULL REFERENCES NHANVIEN(MANV), VAITRO NCHAR(50) ); -- ============================================= -- 8. Tạo bảng NGANSACH (NGÂN SÁCH) -- ============================================= CREATE TABLE NGANSACH( MANS CHAR(10) NOT NULL PRIMARY KEY, MADA CHAR(10) NOT NULL REFERENCES DUAN(MADA), SOTIEN FLOAT, NGAYCAP DATE, TRANGTHAI NVARCHAR(50) ); -- ============================================= -- 9. Tạo bảng CHIPHI (Chi phí) -- ============================================= CREATE TABLE CHIPHI( MACP CHAR(10) NOT NULL PRIMARY KEY, MADA CHAR(10) NOT NULL REFERENCES DUAN(MADA), LOAICP NVARCHAR(50) NOT NULL, MACV CHAR(10) NOT NULL REFERENCES CONGVIEC(MACV), SOTIENCHI FLOAT, NGAYCHI DATE, TRANGTHAI NVARCHAR(50) ); -- ============================================= -- 10. Tạo bảng HOADON (Hóa đơn) -- ============================================= CREATE TABLE HOADON( MAHD CHAR(10) NOT NULL PRIMARY KEY, MADA CHAR(10) NOT NULL REFERENCES DUAN(MADA), MAKH CHAR(10) NOT NULL REFERENCES KHACHHANG(MAKH), TENKH NVARCHAR(50), TRANGTHAI NVARCHAR(50), TONGTIENTT FLOAT, NGAYTAO DATE, HANTHANHTOAN DATE ); -- ============================================= -- 11. Tạo bảng THANHTOAN (Thanh toán) -- ============================================= CREATE TABLE THANHTOAN( MATT CHAR(10) NOT NULL PRIMARY KEY, MAHD CHAR(10) NOT NULL REFERENCES HOADON(MAHD), SOTIENTT FLOAT, NGAYNHAN DATE ); -- ============================================= -- 12. Tạo bảng BAOCAO (Báo cáo) -- ============================================= CREATE TABLE BAOCAO( MABC CHAR(10) NOT NULL PRIMARY KEY, MADA CHAR(10) NOT NULL REFERENCES DUAN(MADA), NGAYBC DATE, NOIDUNG NVARCHAR(100), MANV CHAR(10) NOT NULL REFERENCES NHANVIEN(MANV) ); -------------------------------------------------------------------------------------- -- ============================================= -- CHÈN DỮ LIỆU CHO BẢNG PHONGBAN -- ============================================= INSERT INTO PHONGBAN VALUES ('PB01', N'Phòng Phát triển phần mềm',6), ('PB02', N'Phòng Hạ tầng mạng', 4), ('PB03', N'Phòng Kiểm thử & Đảm bảo chất lượng', 3), ('PB04', N'Phòng Tài chính - Kế toán',2); -- ============================================= -- CHÈN DỮ LIỆU CHO BẢNG CHUCVU (rút gọn, hợp lý) -- ============================================= INSERT INTO CHUCVU VALUES ('CVU01', N'Giám đốc dự án'), ('CVU02', N'Trưởng phòng'), ('CVU03', N'Lập trình viên'), ('CVU04', N'Kỹ sư mạng'), ('CVU05', N'Kiểm thử viên'), ('CVU06', N'Nhân viên kế toán'); -- ============================================= -- CHÈN DỮ LIỆU CHO BẢNG NHANVIEN (ĐỦ 15 NGƯỜI) -- ============================================= INSERT INTO NHANVIEN VALUES -- PB01: Phòng Phát triển phần mềm (6 người) ('NV01', 'PB01', 'CVU01', N'Nguyễn Văn An', N'Nam', '036982145789', N'Hà Nội', 'an.nguyen@company.com', '0976123458'), ('NV02', 'PB01', 'CVU02', N'Lê Thị Hương', N'Nữ', '024865379201', N'Hà Nội', 'huong.le@company.com', '0912334765'), ('NV03', 'PB01', 'CVU03', N'Trần Minh Khoa', N'Nam', '052476819334', N'Hải Phòng', 'khoa.tran@company.com', '0938457123'), ('NV04', 'PB01', 'CVU03', N'Phạm Quang Anh', N'Nam', '063985472190', N'Hà Nội', 'anh.pham@company.com', '0945182736'), ('NV05', 'PB01', 'CVU03', N'Đặng Thị Thu', N'Nữ', '015983742561', N'Nam Định', 'thu.dang@company.com', '0986345127'), ('NV06', 'PB01', 'CVU03', N'Hoàng Văn Nam', N'Nam', '071935826470', N'Hà Nam', 'nam.hoang@company.com', '0902845679'), -- PB02: Phòng Hạ tầng mạng (4 người) ('NV07', 'PB02', 'CVU02', N'Phạm Thu Hà', N'Nữ', '048276195334', N'Hải Dương', 'ha.pham@company.com', '0934728105'), ('NV08', 'PB02', 'CVU04', N'Vũ Đức Long', N'Nam', '037492861570', N'Bắc Ninh', 'long.vu@company.com', '0981273465'), ('NV09', 'PB02', 'CVU04', N'Nguyễn Anh Tuấn', N'Nam', '026591873460', N'Hà Nội', 'tuan.nguyen@company.com', '0978321469'), ('NV10', 'PB02', 'CVU04', N'Lưu Thị Hạnh', N'Nữ', '042879315670', N'Hải Phòng', 'hanh.luu@company.com', '0962748391'), -- PB03: Phòng Kiểm thử & Đảm bảo chất lượng (3 người) ('NV11', 'PB03', 'CVU02', N'Trần Thị Lan', N'Nữ', '058963217405', N'Hà Nội', 'lan.tran@company.com', '0942387156'), ('NV12', 'PB03', 'CVU05', N'Phan Quang Huy', N'Nam', '049871632095', N'Hưng Yên', 'huy.phan@company.com', '0931548276'), ('NV13', 'PB03', 'CVU05', N'Nguyễn Thị Trang', N'Nữ', '035987264108', N'Hà Nam', 'trang.nguyen@company.com', '0975683421'), -- PB04: Phòng Tài chính - Kế toán (2 người) ('NV14', 'PB04', 'CVU02', N'Đỗ Thị Mai', N'Nữ', '067498123570', N'Thái Bình', 'mai.do@company.com', '0953872641'), ('NV15', 'PB04', 'CVU06', N'Nguyễn Thùy Linh', N'Nữ', '033215879640', N'Hà Nội', 'linh.nguyen@company.com', '0994152876'); INSERT INTO KHACHHANG VALUES ('KH01', N'Nguyễn Văn Bình', '012345678901', N'Hà Nội', 'binh.nguyen@gmail.com', '0912345678'), ('KH02', N'Trần Thị Hoa', '023456789012', N'Hải Phòng', 'hoa.tran@yahoo.com', '0987654321'), ('KH03', N'Lê Quang Huy', '034567890123', N'Đà Nẵng', 'huy.le@gmail.com', '0905123456'), ('KH04', N'Phạm Thu Trang', '045678901234', N'Hồ Chí Minh', 'trang.pham@gmail.com', '0938765432'); -- chèn dl bảng DUAN INSERT INTO DUAN VALUES ('DA01', N'Ứng dụng quản lý chi tiêu cá nhân', 'KH01', '2024-02-01', '2024-08-30', '2024-07-15', N'Hoàn thành'), ('DA02', N'Phần mềm học tiếng Anh trực tuyến', 'KH02', '2025-04-10', '2025-12-20', NULL, N'Đang triển khai'), ('DA03', N'Ứng dụng đặt đồ ăn nhanh', 'KH03', '2025-06-15', '2026-03-10', NULL, N'Đang triển khai'), ('DA04', N'Hệ thống quản lý nhà trọ', 'KH04', '2025-09-01', '2026-07-15', NULL, N'Khởi động'); -- Chèn dl bảng CONGVIEC của các dự án INSERT INTO CONGVIEC VALUES -- DA01: Ứng dụng quản lý chi tiêu cá nhân (Hoàn thành) ('CV01', N'Phân tích yêu cầu', 'DA01', '2024-02-01', '2024-02-15', '2024-02-15', N'Hoàn thành'), ('CV02', N'Thiết kế giao diện', 'DA01', '2024-02-16', '2024-03-10', '2024-03-10', N'Hoàn thành'), ('CV03', N'Lập trình tính năng chính', 'DA01', '2024-03-11', '2024-05-20', '2024-05-18', N'Hoàn thành'), ('CV04', N'Kiểm thử hệ thống', 'DA01', '2024-05-21', '2024-06-30', '2024-06-28', N'Hoàn thành'), ('CV05', N'Lập báo cáo tài chính dự án', 'DA01', '2024-07-01', '2024-07-15', '2024-07-15', N'Hoàn thành'), -- DA02: Phần mềm học tiếng Anh trực tuyến ('CV06', N'Phân tích yêu cầu', 'DA02', '2025-04-10', '2025-04-25', '2025-04-25', N'Hoàn thành'), ('CV07', N'Thiết kế giao diện người dùng', 'DA02', '2025-04-26', '2025-11-10', NULL, N'Đang thực hiện'), ('CV08', N'Lập trình chức năng học tập', 'DA02', '2025-06-01', '2025-11-20', NULL, N'Đang thực hiện'), ('CV09', N'Thiết lập hệ thống thanh toán', 'DA02', '2025-09-02', '2025-12-15', NULL, N'Chưa bắt đầu'), ('CV10', N'Lập kế hoạch chi phí', 'DA02', '2025-10-16', '2025-12-23', NULL, N'Chưa bắt đầu'), -- DA03: Ứng dụng đặt đồ ăn nhanh ('CV11', N'Phân tích nhu cầu người dùng', 'DA03', '2025-06-15', '2025-06-30', '2025-06-29', N'Hoàn thành'), ('CV12', N'Thiết kế giao diện người dùng', 'DA03', '2025-07-01', '2025-11-10', NULL, N'Đang thực hiện'), ('CV13', N'Lập trình module đặt món', 'DA03', '2025-08-11', '2025-12-10', NULL, N'Đang thực hiện'), ('CV14', N'Kiểm thử và tối ưu hiệu năng', 'DA03', '2025-12-11', '2026-02-01', NULL, N'Chưa bắt đầu'), ('CV15', N'Tổng hợp báo cáo chi phí dự án', 'DA03', '2026-02-02', '2026-02-15', NULL, N'Chưa bắt đầu'), -- DA04: Hệ thống quản lý nhà trọ ('CV16', N'Khảo sát và thu thập yêu cầu', 'DA04', '2025-09-01', '2025-10-15', NULL, N'Đang thực hiện'), ('CV17', N'Thiết kế cơ sở dữ liệu', 'DA04', '2025-09-16', '2025-10-30', NULL, N'Đang thực hiện'), ('CV18', N'Lập trình module quản lý phòng', 'DA04', '2025-10-11', '2026-01-15', NULL, N'Chưa bắt đầu'), ('CV19', N'Kiểm thử hệ thống', 'DA04', '2025-01-16', '2026-03-01', NULL, N'Chưa bắt đầu'), ('CV20', N'Lập kế hoạch quyết toán', 'DA04', '2026-03-02', '2026-04-01', NULL, N'Chưa bắt đầu'); -- Chèn dữ liệu bảng PHANCONGCV -- ============================================= -- -- ============================================= INSERT INTO PHANCONGCV VALUES -- DA01 ('PC01', 'DA01', 'CV01', 'NV01', N'Giám đốc dự án'), ('PC02', 'DA01', 'CV02', 'NV03', N'Lập trình viên chính'), ('PC03', 'DA01', 'CV03', 'NV04', N'Lập trình viên phụ'), ('PC04', 'DA01', 'CV04', 'NV12', N'Kiểm thử viên'), ('PC05', 'DA01', 'CV05', 'NV15', N'Kế toán dự án'), -- DA02: ('PC06', 'DA02', 'CV06', 'NV01', N'Giám đốc dự án'), ('PC07', 'DA02', 'CV07', 'NV02', N'Trưởng phòng phát triển'), ('PC08', 'DA02', 'CV07', 'NV03', N'Lập trình viên chính'), ('PC09', 'DA02', 'CV08', 'NV05', N'Lập trình viên giao diện'), ('PC10', 'DA02', 'CV08', 'NV08', N'Hỗ trợ kỹ thuật mạng'), ('PC11', 'DA02', 'CV09', 'NV09', N'Cấu hình server'), ('PC12', 'DA02', 'CV10', 'NV15', N'Kế toán dự án'), -- DA03: 6 bản ghi ('PC13', 'DA03', 'CV11', 'NV02', N'Trưởng nhóm lập trình'), ('PC14', 'DA03', 'CV12', 'NV04', N'Lập trình viên chính'), ('PC15', 'DA03', 'CV13', 'NV06', N'Lập trình viên phụ'), ('PC16', 'DA03', 'CV13', 'NV03', N'Lập trình viên hỗ trợ'), ('PC17', 'DA03', 'CV14', 'NV10', N'Hỗ trợ mạng'), ('PC18', 'DA03', 'CV15', 'NV15', N'Kế toán dự án'), -- DA04: 6 bản ghi ('PC19', 'DA04', 'CV16', 'NV01', N'Giám đốc dự án'), ('PC20', 'DA04', 'CV17', 'NV03', N'Lập trình viên chính'), ('PC21', 'DA04', 'CV17', 'NV07', N'Hỗ trợ hệ thống'), ('PC22', 'DA04', 'CV18', 'NV08', N'Lập trình module quản lý'), ('PC23', 'DA04', 'CV19', 'NV12', N'Kiểm thử viên'), ('PC24', 'DA04', 'CV20', 'NV14', N'Kế toán phụ trách'); -- Chèn dữ liệu bảng NGANSACH INSERT INTO NGANSACH VALUES ('NS01', 'DA01', 500000000, '2024-02-10', N'Đã duyệt'), ('NS02', 'DA02', 800000000, '2025-04-20', N'Đã duyệt'), ('NS03', 'DA03', 650000000, '2025-06-25', N'Đã duyệt'), ('NS04', 'DA04', 900000000, '2025-09-10', N'Chưa duyệt'); -- Chèn dữ liệu bảng CHIPHI INSERT INTO CHIPHI VALUES ('CP01', 'DA01', N'Lương nhân viên lập trình', 'CV03', 120000000, '2024-05-10', N'Đã chi'), ('CP02', 'DA01', N'Chi phí kiểm thử phần mềm', 'CV04', 60000000, '2024-06-20', N'Đã chi'), ('CP03', 'DA01', N'Chi phí kế toán dự án', 'CV05', 40000000, '2024-07-05', N'Đã chi'), ('CP04', 'DA02', N'Lương nhân viên phát triển', 'CV08', 150000000, '2025-09-10', N'Đã chi'), ('CP05', 'DA02', N'Mua máy chủ và thiết bị', 'CV09', 100000000, NULL, N'Chưa chi'), ('CP06', 'DA02', N'Chi phí kế toán dự án', 'CV10', 50000000, NULL, N'Chưa chi'), ('CP07', 'DA03', N'Lương nhân viên lập trình', 'CV13', 130000000, '2025-11-15', N'Đã chi'), ('CP08', 'DA03', N'Chi phí kiểm thử và tối ưu', 'CV14', 70000000, NULL, N'Chưa chi'), ('CP09', 'DA03', N'Chi phí kế toán dự án', 'CV15', 45000000, NULL, N'Chưa chi'), ('CP10', 'DA04', N'Lương nhân viên lập trình', 'CV18', 160000000, NULL, N'Chưa chi'), ('CP11', 'DA04', N'Chi phí kiểm thử hệ thống', 'CV19', 80000000, NULL, N'Chưa chi'), ('CP12', 'DA04', N'Chi phí kế toán và quyết toán', 'CV20', 50000000, NULL, N'Chưa chi'); -- Chèn dữ liệu mới cho bảng HOADON INSERT INTO HOADON VALUES ('HD01', 'DA01', 'KH01', N'Nguyễn Văn Bình', N'Đã thanh toán', 2200000000, '2024-07-10', '2024-07-30'), ('HD02', 'DA02', 'KH02', N'Trần Thị Hoa', N'Thanh toán một phần', 1200000000, '2025-11-15', '2025-12-20'), ('HD03', 'DA03', 'KH03', N'Lê Quang Huy', N'Chưa thanh toán', 1500000000, '2025-02-20', '2026-03-10'), ('HD04', 'DA04', 'KH04', N'Phạm Thu Trang', N'Chưa thanh toán', 2140000000, '2025-04-10', '2026-04-30'); -- chèn dữ liệu cho bảng THANHTOAN INSERT INTO THANHTOAN VALUES ('TT01', 'HD01', 2200000000, '2024-07-25'), ('TT02', 'HD02', 500000000, '2024-12-05'); -- Chèn dữ liệu báo cáo phù hợp với tiến độ các dự án INSERT INTO BAOCAO VALUES ('BC01', 'DA01', '2024-07-30', N'Dự án đã hoàn thành đúng tiến độ, hệ thống hoạt động ổn định.', 'NV01'), ('BC02', 'DA01', '2024-07-15', N'Hoàn tất báo cáo tài chính và nghiệm thu với khách hàng.', 'NV15'), ('BC03', 'DA02', '2025-08-01', N'Hoàn thành lập trình giao diện và đang kiểm thử.', 'NV05'), ('BC04', 'DA02', '2025-10-20', N'Đang triển khai hệ thống thanh toán trực tuyến.', 'NV13'), ('BC05', 'DA03', '2025-10-01', N'Đã hoàn tất module đặt món và đang tối ưu hiệu năng.', 'NV04'), ('BC06', 'DA03', '2026-02-10', N'Tiến hành tổng hợp chi phí và cập nhật kế hoạch tài chính.', 'NV15'), ('BC07', 'DA04', '2025-10-01', N'Đã khảo sát yêu cầu khách hàng và phê duyệt thiết kế ban đầu.', 'NV11'), ('BC08', 'DA04', '2025-11-15', N'Đang thiết kế cơ sở dữ liệu và cấu trúc hệ thống.', 'NV03'); -- ======================================================= TẠO VIEW ================================================================== ---- 1.Tạo view quản lý nhân viên CREATE OR ALTER VIEW V_QUANLY_NHANVIEN AS( SELECT NHANVIEN.MANV,TENNV,GIOITINH,SOCCCD,DIACHI,EMAIL,DIENTHOAI, PHONGBAN.MAPB,TENPB, CHUCVU.MACVU,TENCVU FROM NHANVIEN, PHONGBAN, CHUCVU WHERE NHANVIEN.MAPB = PHONGBAN.MAPB AND NHANVIEN.MACVU = CHUCVU.MACVU ); SELECT *FROM V_QUANLY_NHANVIEN DROP VIEW V_QUANLY_NHANVIEN ------ 2.VIEW QUẢN LÝ DỰ ÁN: LƯU TẤT CẢ THÀNH VIÊN CỦA TỪNG DỰ ÁN CREATE OR ALTER VIEW V_QUANLY_DUAN AS( SELECT DUAN.MADA, DUAN.TENDA, KHACHHANG.MAKH,TENKH, DUAN.NGAYBD, NGAYKTDUKIEN, NGAYKTTHUCTE, TIENDO, NHANVIEN.MANV,TENNV, PHONGBAN.TENPB, CHUCVU.TENCVU, PHANCONGCV.VAITRO FROM DUAN, PHANCONGCV, NHANVIEN, PHONGBAN, CHUCVU, KHACHHANG WHERE DUAN.MADA = PHANCONGCV.MADA AND PHANCONGCV.MANV = NHANVIEN.MANV AND NHANVIEN.MAPB = PHONGBAN.MAPB AND NHANVIEN.MACVU = CHUCVU.MACVU AND DUAN.MAKH = KHACHHANG.MAKH ); -- Xem tất cả dự án và thành viên SELECT * FROM V_QUANLY_DUAN; -- Xem thành viên theo từng dự án SELECT * FROM V_QUANLY_DUAN WHERE MADA = 'DA02'; -- Thống kê số lượng thành viên mỗi dự án SELECT MADA, TENDA, COUNT(MANV) AS SOLUONGTHANHVIEN FROM V_QUANLY_DUAN GROUP BY MADA, TENDA; -- Xem các dự án của 1 khách hàng cụ thể SELECT * FROM V_QUANLY_DUAN WHERE MAKH = 'KH02'; DROP VIEW V_QUANLY_DUAN -----------3.VIEW QUẢN LÝ CÔNG VIỆC ---------------- CREATE OR ALTER VIEW V_QUANLY_CONGVIEC AS( SELECT CONGVIEC.MACV,TENCV, DUAN.MADA,TENDA,NGAYGIAO,DEADLINE,NGAYHT,TRANGTHAI, NHANVIEN.MANV,TENNV, PHANCONGCV.VAITRO, PHONGBAN.TENPB,CHUCVU.TENCVU FROM CONGVIEC, DUAN, PHANCONGCV, NHANVIEN, PHONGBAN, CHUCVU WHERE CONGVIEC.MADA = DUAN.MADA AND CONGVIEC.MACV = PHANCONGCV.MACV AND PHANCONGCV.MANV = NHANVIEN.MANV AND NHANVIEN.MAPB = PHONGBAN.MAPB AND NHANVIEN.MACVU = CHUCVU.MACVU ); SELECT *FROM V_QUANLY_CONGVIEC SELECT * FROM V_QUANLY_CONGVIEC WHERE MACV = 'CV17'; -------- 4. VIEW TRONG VIEW: Tổng hợp số lượng cv của dự án ------------------ CREATE OR ALTER VIEW V_TONGHOP_DUAN_CONGVIEC AS( SELECT MADA,TENDA,COUNT(MACV) AS SO_LUONG_CONG_VIEC FROM V_QUANLY_CONGVIEC GROUP BY MADA,TENDA ); SELECT *FROM V_TONGHOP_DUAN_CONGVIEC SELECT *FROM V_TONGHOP_DUAN_CONGVIEC WHERE SO_LUONG_CONG_VIEC =(SELECT MAX(SO_LUONG_CONG_VIEC) FROM V_TONGHOP_DUAN_CONGVIEC) -------- 5. VIEW tra cứu hóa đơn ------------------ CREATE OR ALTER VIEW V_TRACUU_HOADON AS( SELECT HOADON.MAHD, DUAN.MADA,TENDA, HOADON.MAKH, KHACHHANG.TENKH, TRANGTHAI,TONGTIENTT,NGAYTAO,HANTHANHTOAN FROM HOADON, DUAN, KHACHHANG WHERE HOADON.MADA = DUAN.MADA AND HOADON.MAKH = KHACHHANG.MAKH ); SELECT *FROM V_TRACUU_HOADON DROP VIEW V_TRACUU_HOADOn ----------6. VIEW TỔNG HỢP BÁO CÁO-------------- CREATE OR ALTER VIEW V_TONGHOP_BAOCAO AS( SELECT MABC,NGAYBC,NOIDUNG, DUAN.TENDA, NHANVIEN.TENNV FROM BAOCAO, DUAN , NHANVIEN WHERE BAOCAO.MADA = DUAN.MADA AND BAOCAO.MANV = NHANVIEN.MANV ); SELECT *FROM V_TONGHOP_BAOCAO -- ============================== Tạo các thủ tục THÊM/SỬA/XÓA =================================================================== -- 1.THỦ TỤC THÊM KH CREATE OR ALTER PROC SP_THEM_KHACHHANG (@MAKH CHAR(10),@TENKH NVARCHAR(50),@SOCCCD VARCHAR(15), @DIACHI NVARCHAR(50),@EMAIL VARCHAR(50),@DIENTHOAI VARCHAR(15)) AS IF EXISTS (SELECT *FROM KHACHHANG WHERE MAKH = @MAKH) PRINT N'Mã khách hàng đã tồn tại. Vui lòng nhập mã khác.' ELSE INSERT INTO KHACHHANG VALUES (@MAKH, @TENKH, @SOCCCD, @DIACHI, @EMAIL, @DIENTHOAI) GO EXEC SP_THEM_KHACHHANG 'KH05', N'Ngô Thanh Tùng', '056789012345', N'Huế', 'tung.ngo@gmail.com', '0904567890'; -- 2.THỦ TỤC THÊM DỰ ÁN CREATE OR ALTER PROC SP_THEM_DUAN (@MADA CHAR(10),@TENDA NVARCHAR(50),@MAKH CHAR(10),@NGAYBD DATE, @NGAYKTDUKIEN DATE,@NGAYKTTHUCTE DATE = NULL,@TIENDO NVARCHAR(50)) AS BEGIN IF EXISTS (SELECT *FROM DUAN WHERE MADA = @MADA) BEGIN PRINT N' Mã dự án đã tồn tại. Vui lòng nhập mã khác.' END IF NOT EXISTS (SELECT *FROM KHACHHANG WHERE MAKH = @MAKH) BEGIN PRINT N' Mã khách hàng không tồn tại. Vui lòng kiểm tra lại.' END ELSE INSERT INTO DUAN VALUES (@MADA, @TENDA, @MAKH, @NGAYBD, @NGAYKTDUKIEN, @NGAYKTTHUCTE, @TIENDO) PRINT N' Thêm dự án thành công!'; END GO EXEC SP_THEM_DUAN 'DA05', N'Hệ thống bán hàng online', 'KH02', '2025-01-05', '2025-07-15', NULL, N'Khởi động'; SELECT *FROM DUAN -- 3. Thủ tục sửa Khách hàng CREATE OR ALTER PROC SP_SUA_KHACHHANG (@MAKH CHAR(10),@TENKH NVARCHAR(50),@SOCCCD VARCHAR(15), @DIACHI NVARCHAR(50),@EMAIL VARCHAR(50),@DIENTHOAI VARCHAR(15)) AS -- Kiểm tra mã khách hàng có tồn tại không IF NOT EXISTS (SELECT *FROM KHACHHANG WHERE MAKH = @MAKH) PRINT N' Không tìm thấy khách hàng có mã này!' -- Cập nhật thông tin khách hàng UPDATE KHACHHANG SET TENKH = @TENKH,SOCCCD = @SOCCCD, DIACHI = @DIACHI,EMAIL = @EMAIL,DIENTHOAI = @DIENTHOAI WHERE MAKH = @MAKH; PRINT N' Cập nhật thông tin khách hàng thành công!'; GO EXEC SP_SUA_KHACHHANG 'KH05', N'Ngô Thanh Anh', '056789012345', N'Nghệ An', 'anh.ngo@gmail.com', '0904567890'; SELECT *FROM KHACHHANG -- 4. THỦ TỤC SỬA DỰ ÁN CREATE OR ALTER PROC SP_SUA_DUAN ( @MADA CHAR(10),@TENDA NVARCHAR(50),@MAKH CHAR(10),@NGAYBD DATE, @NGAYKTDUKIEN DATE,@NGAYKTTHUCTE DATE,@TIENDO NVARCHAR(50)) AS -- Kiểm tra mã dự án có tồn tại không IF NOT EXISTS (SELECT *FROM DUAN WHERE MADA = @MADA) PRINT N'Không tìm thấy dự án có mã này!' -- Cập nhật thông tin dự án UPDATE DUAN SET TENDA = @TENDA, MAKH = @MAKH, NGAYBD = @NGAYBD,NGAYKTDUKIEN = @NGAYKTDUKIEN,NGAYKTTHUCTE = @NGAYKTTHUCTE,TIENDO = @TIENDO WHERE MADA = @MADA PRINT N' Cập nhật thông tin dự án thành công!' GO EXEC SP_SUA_DUAN 'DA05', N'Hệ thống quản lý chấm công', 'KH05', '2025-01-05', '2025-07-15', NULL, N'Khởi động'; SELECT *FROM DUAN -- 5.Thủ tục xóa khách hàng SELECT *FROM KHACHHANG CREATE OR ALTER PROC SP_XOA_KHACHHANG @MAKH NVARCHAR(10) AS IF NOT EXISTS (SELECT *FROM KHACHHANG WHERE MAKH = @MAKH) PRINT N'Không tìm thấy khách hàng có mã này!' -- Xóa dữ liệu liên quan trong DUAN trước DELETE FROM DUAN WHERE MAKH = @MAKH -- Sau đó xóa khách hàng DELETE FROM KHACHHANG WHERE MAKH = @MAKH PRINT N'Xóa khách hàng thành công!' GO EXEC SP_XOA_KHACHHANG 'KH10' EXEC SP_XOA_KHACHHANG 'KH05' -- 6.Thủ tục xóa Dự Án CREATE OR ALTER PROC SP_XOA_DUAN @MADA CHAR(10) AS BEGIN -- Kiểm tra dự án có tồn tại không IF NOT EXISTS (SELECT 1 FROM DUAN WHERE MADA = @MADA) BEGIN PRINT N'Không tìm thấy dự án có mã này!' RETURN END -- Xóa dữ liệu liên quan theo đúng thứ tự ràng buộc khóa ngoại DELETE FROM THANHTOAN WHERE MAHD IN (SELECT MAHD FROM HOADON WHERE MADA = @MADA) DELETE FROM HOADON WHERE MADA = @MADA DELETE FROM CHIPHI WHERE MADA = @MADA DELETE FROM NGANSACH WHERE MADA = @MADA DELETE FROM BAOCAO WHERE MADA = @MADA DELETE FROM PHANCONGCV WHERE MADA = @MADA DELETE FROM CONGVIEC WHERE MADA = @MADA DELETE FROM DUAN WHERE MADA = @MADA PRINT N'Xóa dự án và toàn bộ dữ liệu liên quan thành công!' END GO SELECT *FROM DUAN EXEC SP_XOA_DUAN 'DA11' EXEC SP_XOA_DUAN'DA05' -- ============================================= -- PHẦN 5: Viết các thủ tục tính toán, hàm theo nghiệp vụ bài toán -- ============================================= -- 5.1 Hàm tính tổng chi phí của dự án (chỉ tính 'Đã chi') CREATE OR ALTER FUNCTION FN_TONG_CHIPHI_DUAN (@MADA CHAR(10)) RETURNS FLOAT AS BEGIN DECLARE @TONGCHIPHI FLOAT; SELECT @TONGCHIPHI = SUM(SOTIENCHI) FROM CHIPHI WHERE MADA = @MADA AND TRANGTHAI = N'Đã chi'; RETURN ISNULL(@TONGCHIPHI, 0); END GO -- Test hàm FN_TONG_CHIPHI_DUAN SELECT *FROM CHIPHI SELECT dbo.FN_TONG_CHIPHI_DUAN('DA01') AS TONG_CHI_PHI_DA01; SELECT MADA, TENDA, dbo.FN_TONG_CHIPHI_DUAN(MADA) AS TONGCHIPHI FROM DUAN; -- 5.2 Hàm tính tổng thành viên của dự án CREATE OR ALTER FUNCTION FN_TONG_THANHVIEN_DUAN (@MADA CHAR(10)) RETURNS INT AS BEGIN DECLARE @TONGTV INT SELECT @TONGTV = COUNT(DISTINCT MANV) --//COUNT(MANV) → đếm tất cả dòng (kể cả trùng nhân viên). FROM PHANCONGCV /*COUNT(DISTINCT MANV) → chỉ đếm mỗi nhân viên 1 lần.*/ WHERE MADA = @MADA; RETURN ISNULL(@TONGTV, 0) END GO -- Test hàm FN_TONG_THANHVIEN_DUAN SELECT dbo.FN_TONG_THANHVIEN_DUAN('DA02') AS TONGTHANHVIEN_DA02 SELECT dbo.FN_TONG_THANHVIEN_DUAN('DA01') AS TONGTHANHVIEN_DA01 SELECT MADA, TENDA, dbo.FN_TONG_THANHVIEN_DUAN(MADA) AS TONGTHANHVIEN FROM DUAN -- 5.3 Hàm tính tổng thanh toán của khách hàng (sum từ THANHTOAN) CREATE OR ALTER FUNCTION FN_TONG_THANHTOAN_KHACHHANG (@MAKH CHAR(10)) RETURNS FLOAT AS BEGIN DECLARE @TONGTT FLOAT SELECT @TONGTT = SUM(SOTIENTT) FROM THANHTOAN WHERE MAHD IN (SELECT MAHD FROM HOADON WHERE MAKH = @MAKH) RETURN ISNULL(@TONGTT, 0) END GO -- Test hàm FN_TONG_THANHTOAN_KHACHHANG SELECT *FROM THANHTOAN SELECT dbo.FN_TONG_THANHTOAN_KHACHHANG('KH01') AS TONG_THANH_TOAN_KH01; SELECT dbo.FN_TONG_THANHTOAN_KHACHHANG('KH03') AS TONG_THANH_TOAN_KH03; -- 5.4 Hàm tính số lượng thành viên tham gia một công việc CREATE OR ALTER FUNCTION FN_SOLUONG_THANHVIEN_CONGVIEC (@MACV CHAR(10)) RETURNS INT AS BEGIN DECLARE @SOLUONG INT; SELECT @SOLUONG = COUNT(MANV) FROM PHANCONGCV WHERE MACV = @MACV; RETURN ISNULL(@SOLUONG, 0); END GO -- Test hàm FN_SOLUONG_THANHVIEN_CONGVIEC SELECT dbo.FN_SOLUONG_THANHVIEN_CONGVIEC('CV07') AS SO_LUONG_CV07; SELECT dbo.FN_SOLUONG_THANHVIEN_CONGVIEC('CV16') AS SO_LUONG_CV16; SELECT *FROM PHANCONGCV -- ================================== -- PHẦN 6: Viết các thủ tục thống kê -- ================================== -- 6.1 Thủ tục thống kê tổng chi phí theo dự án CREATE OR ALTER PROC SP_THONGKE_TONGCHIPHI_DUAN (@MADA CHAR(10) = NULL) AS BEGIN IF @MADA IS NULL SELECT MADA, TENDA, dbo.FN_TONG_CHIPHI_DUAN(MADA) AS TONG_CHI_PHI FROM DUAN; ELSE SELECT MADA, TENDA, dbo.FN_TONG_CHIPHI_DUAN(@MADA) AS TONG_CHI_PHI FROM DUAN WHERE MADA = @MADA; END GO -- Test thủ tục SP_THONGKE_TONGCHIPHI_DUAN EXEC SP_THONGKE_TONGCHIPHI_DUAN 'DA01'; EXEC SP_THONGKE_TONGCHIPHI_DUAN; --------6.2 Thủ tục thống kê tổng ngân sách còn lại theo dự án CREATE OR ALTER PROC SP_THONGKE_NGANSACH_CONLAI_DUAN (@MADA CHAR(10) = NULL) AS BEGIN IF @MADA IS NULL SELECT DUAN.MADA,TENDA,NGANSACH.SOTIEN, dbo.FN_TONG_CHIPHI_DUAN(DUAN.MADA) AS TongChiPhi, NGANSACH.SOTIEN - dbo.FN_TONG_CHIPHI_DUAN(DUAN.MADA) AS NganSachConLai FROM DUAN, NGANSACH WHERE DUAN.MADA=NGANSACH.MADA ELSE SELECT DUAN.MADA,TENDA,NGANSACH.SOTIEN, dbo.FN_TONG_CHIPHI_DUAN(DUAN.MADA) AS TongChiPhi, NGANSACH.SOTIEN- dbo.FN_TONG_CHIPHI_DUAN(DUAN.MADA) AS NganSachConLai FROM DUAN, NGANSACH WHERE DUAN.MADA = @MADA AND DUAN.MADA= NGANSACH.MADA END GO SELECT *FROM NGANSACH EXEC SP_THONGKE_NGANSACH_CONLAI_DUAN -- 6.3 Thủ tục thống kê tổng thành viên theo dự án CREATE OR ALTER PROC SP_THONGKE_TONGTHANHVIEN_DUAN (@MADA CHAR(10) = NULL) AS BEGIN IF @MADA IS NULL SELECT MADA, TENDA, dbo.FN_TONG_THANHVIEN_DUAN(MADA) AS TONG_THANH_VIEN FROM DUAN; ELSE SELECT MADA, TENDA, dbo.FN_TONG_THANHVIEN_DUAN(@MADA) AS TONG_THANH_VIEN FROM DUAN WHERE MADA = @MADA; END GO -- Test thủ tục SP_THONGKE_TONGTHANHVIEN_DUAN EXEC SP_THONGKE_TONGTHANHVIEN_DUAN 'DA03'; EXEC SP_THONGKE_TONGTHANHVIEN_DUAN; -- 6.4 Thủ tục thống kê tổng thanh toán theo khách hàng CREATE OR ALTER PROC SP_THONGKE_TONGTHANHTOAN_KH (@MAKH CHAR(10) = NULL) AS BEGIN IF @MAKH IS NULL SELECT MAKH, TENKH, dbo.FN_TONG_THANHTOAN_KHACHHANG(MAKH) AS TONG_THANH_TOAN FROM KHACHHANG; ELSE SELECT MAKH, TENKH, dbo.FN_TONG_THANHTOAN_KHACHHANG(@MAKH) AS TONG_THANH_TOAN FROM KHACHHANG WHERE MAKH = @MAKH; END GO -- Test thủ tục SP_THONGKE_TONGTHANHTOAN_KH EXEC SP_THONGKE_TONGTHANHTOAN_KH 'KH02'; EXEC SP_THONGKE_TONGTHANHTOAN_KH; -- 6.5 Thủ tục thống kê số lượng thành viên theo công việc CREATE OR ALTER PROC SP_THONGKE_SOLUONGTV_CONGVIEC (@MACV CHAR(10) = NULL) AS BEGIN IF @MACV IS NULL SELECT MACV, TENCV, dbo.FN_SOLUONG_THANHVIEN_CONGVIEC(MACV) AS SO_LUONG_THANH_VIEN FROM CONGVIEC; ELSE SELECT MACV, TENCV, dbo.FN_SOLUONG_THANHVIEN_CONGVIEC(@MACV) AS SO_LUONG_THANH_VIEN FROM CONGVIEC WHERE MACV = @MACV; END GO -- Test thủ tục SP_THONGKE_SOLUONGTV_CONGVIEC EXEC SP_THONGKE_SOLUONGTV_CONGVIEC 'CV13'; EXEC SP_THONGKE_SOLUONGTV_CONGVIEC; -- ============================ -- PHẦN 7: Viết các trigger -- ============================ -- 7.1 Trigger kiểm soát ngân sách: Kiểm tra tổng chi phí không vượt ngân sách, nếu vượt thì cập nhật trạng thái 'Chưa chi' CREATE OR ALTER TRIGGER TRG_KIEMTRA_NGANSACH_CHIPHI ON CHIPHI AFTER INSERT, UPDATE AS BEGIN DECLARE @MADA CHAR(10), @SOTIENCHI DECIMAL(18,2), @NGANSACH FLOAT, @TONGCHIPHI FLOAT; SELECT @MADA = MADA, @SOTIENCHI = SOTIENCHI FROM inserted; SELECT @NGANSACH = SOTIEN FROM NGANSACH WHERE MADA = @MADA; SET @TONGCHIPHI = dbo.FN_TONG_CHIPHI_DUAN(@MADA); IF @TONGCHIPHI > @NGANSACH BEGIN UPDATE CHIPHI SET TRANGTHAI = N'Chưa chi' WHERE MACP = (SELECT MACP FROM inserted); PRINT N'Chi phí vượt ngân sách, trạng thái được cập nhật thành Chưa chi!'; END END GO -- Test trigger TRG_KIEMTRA_NGANSACH_CHIPHI -- Insert một khoản chi mới cho DA01 với số tiền lớn để vượt ngân sách (ngân sách DA01: 500M, tổng hiện 220M) SELECT *FROM NGANSACH INSERT INTO CHIPHI (MACP, MADA, LOAICP, MACV, SOTIENCHI, NGAYCHI, TRANGTHAI) VALUES ('CP13', 'DA01', N'Chi phí bổ sung', 'CV05', 300000000, '2024-07-20', N'Đã chi'); --UPDATE CHIPHI SET SOTIENCHI = 120000000 WHERE MACP = 'CP01'; DELETE FROM CHIPHI WHERE MACP = 'CP13'; SELECT *FROM CHIPHI -- 7.2 Trigger kiểm soát hóa đơn: Cập nhật trạng thái dựa trên tổng thanh toán CREATE OR ALTER TRIGGER TRG_CAPNHAT_TRANGTHAI_HOADON_THANHTOAN ON THANHTOAN AFTER INSERT, UPDATE, DELETE AS BEGIN DECLARE @MAHD CHAR(10), @TONGTT FLOAT, @TONGHD FLOAT; IF EXISTS (SELECT * FROM inserted) SELECT @MAHD = MAHD FROM inserted; ELSE IF EXISTS (SELECT * FROM deleted) SELECT @MAHD = MAHD FROM deleted; SET @TONGTT = (SELECT SUM(SOTIENTT) FROM THANHTOAN WHERE MAHD = @MAHD); SELECT @TONGHD = TONGTIENTT FROM HOADON WHERE MAHD = @MAHD; UPDATE HOADON SET TRANGTHAI = CASE WHEN ISNULL(@TONGTT, 0) >= @TONGHD THEN N'Đã thanh toán' WHEN ISNULL(@TONGTT, 0) > 0 THEN N'Thanh toán một phần' ELSE N'Chưa thanh toán' END WHERE MAHD = @MAHD; END GO -- Test trigger TRG_CAPNHAT_TRANGTHAI_HOADON_THANHTOAN -- Insert một thanh toán mới cho HD02 (hiện TONGTIENTT=120M, thanh toán hiện 120M → 'Thanh toán một phần', nhưng nếu thêm để >=) INSERT INTO THANHTOAN VALUES ('TT03', 'HD02', 700000000, '2024-12-10'); DELETE FROM THANHTOAN WHERE MATT = 'TT03'; SELECT *FROM HOADON SELECT *FROM THANHTOAN -- UPDATE lại HD02 về dữ liệu ban đầu -- 7.3 Trigger kiểm tra hạn thanh toán hóa đơn: Cảnh báo nếu quá hạn CREATE OR ALTER TRIGGER TRG_KIEMTRA_HANTHANHTOAN_HOADON ON HOADON AFTER UPDATE AS BEGIN IF UPDATE(TRANGTHAI) OR UPDATE(HANTHANHTOAN) BEGIN DECLARE @MAHD CHAR(10), @TRANGTHAI NVARCHAR(50), @HANTHANHTOAN DATE; SELECT @MAHD = MAHD, @TRANGTHAI = TRANGTHAI, @HANTHANHTOAN = HANTHANHTOAN FROM inserted; IF @TRANGTHAI = N'Chưa thanh toán' AND GETDATE() > @HANTHANHTOAN BEGIN PRINT N'Cảnh báo: Hóa đơn '+ @MAHD + N'đã quá hạn thanh toán!'; END END END GO -- Test trigger TRG_KIEMTRA_HANTHANHTOAN_HOADON -- Update HANTHANHTOAN của HD03 (2026-03-10) và TRANGTHAI = 'Chưa thanh toán' SELECT *FROM HOADON UPDATE HOADON SET HANTHANHTOAN = '2025-10-20', TRANGTHAI = N'Chưa thanh toán' WHERE MAHD = 'HD03'; --UPDATE LẠI dữ liệu ban đầu của HĐ03 UPDATE HOADON SET TRANGTHAI = N'Đã thanh toán' WHERE MAHD = 'HD03'; -- 7.4 Trigger thay đổi tiến độ dự án dựa trên trạng thái công việc CREATE OR ALTER TRIGGER TRG_CAPNHAT_TIENDO_KHI_CAPNHAT_CV ON CONGVIEC AFTER UPDATE AS BEGIN IF UPDATE(TRANGTHAI) OR UPDATE(NGAYHT) BEGIN DECLARE @MADA CHAR(10); SELECT @MADA = MADA FROM inserted; DECLARE @TONG_CV INT, @HOANTHANH INT, @TIENDO NVARCHAR(50); SELECT @TONG_CV = COUNT(MACV) FROM CONGVIEC WHERE MADA = @MADA; SELECT @HOANTHANH = COUNT(MACV) FROM CONGVIEC WHERE MADA = @MADA AND TRANGTHAI = N'Hoàn thành'; IF @TONG_CV = 0 OR @HOANTHANH = 0 SET @TIENDO = N'Khởi động'; ELSE BEGIN DECLARE @TYLE FLOAT = (@HOANTHANH * 100.0) / @TONG_CV; IF @TYLE = 100 SET @TIENDO = N'Hoàn thành'; ELSE IF @TYLE >= 50 SET @TIENDO = N'Đang phát triển'; ELSE SET @TIENDO = N'Đang triển khai'; END UPDATE DUAN SET TIENDO = @TIENDO WHERE MADA = @MADA; PRINT N'Cập nhật tiến độ dự án thành công!'; END END GO -- Test trigger TRG_CAPNHAT_TIENDO_KHI_CAPNHAT_CV SELECT *FROM CONGVIEC SELECT *FROM DUAN -- Update một công việc trong DA02 (5 CV, hiện có CV06 hoàn thành, CV07, CV08 đang thực hiện) thành 'Hoàn thành' UPDATE CONGVIEC SET TRANGTHAI = N'Hoàn thành', NGAYHT = GETDATE() WHERE MACV = 'CV07'; UPDATE CONGVIEC SET TRANGTHAI = N'Hoàn thành', NGAYHT = GETDATE() WHERE MACV = 'CV08'; -- update lại dữ liệu ban đầu UPDATE CONGVIEC SET TRANGTHAI = N'Đang thực hiện', NGAYHT =NULL WHERE MACV = 'CV07'; UPDATE CONGVIEC SET TRANGTHAI = N'Đang thực hiện', NGAYHT = NULL WHERE MACV = 'CV08'; -- Update tất cả công việc DA03 thành 'Hoàn thành' để test 100% UPDATE CONGVIEC SET TRANGTHAI = N'Hoàn thành', NGAYHT = GETDATE() WHERE MADA = 'DA03' -- update lại dữ liệu ban đầu của dự án 03 UPDATE CONGVIEC SET TRANGTHAI = CASE MACV WHEN 'CV11' THEN N'Hoàn thành' WHEN 'CV12' THEN N'Đang thực hiện' WHEN 'CV13' THEN N'Đang thực hiện' WHEN 'CV14' THEN N'Chưa bắt đầu' WHEN 'CV15' THEN N'Chưa bắt đầu' END, NGAYHT = CASE MACV WHEN 'CV11' THEN '2024-06-29' ELSE NULL END WHERE MADA = 'DA03'; DROP TRIGGER TRG_CAPNHAT_TIENDO_KHI_CAPNHAT_CV -- 7.5 Trigger kiểm soát phân công CREATE OR ALTER TRIGGER TRG_KIEMTRA_PHANCONG ON PHANCONGCV INSTEAD OF INSERT AS BEGIN DECLARE @MACV CHAR(10), @DEADLINE DATE; DECLARE @SOLUONG INT, @MAX INT = 5; -- Giả sử max 5 người/công việc SELECT @MACV = MACV FROM inserted; SELECT @DEADLINE = DEADLINE FROM CONGVIEC WHERE MACV = @MACV; -- 1. Kiểm tra hạn công việc IF GETDATE() > @DEADLINE BEGIN PRINT N'Không thể phân công vào công việc đã quá hạn!'; RETURN; END -- 2. Kiểm tra số lượng người tham gia SET @SOLUONG = dbo.FN_SOLUONG_THANHVIEN_CONGVIEC(@MACV) + 1; IF @SOLUONG > @MAX BEGIN PRINT N'Số lượng thành viên tham gia công việc vượt quá giới hạn tối đa!'; RETURN; END -- 3. Nếu qua hết kiểm tra thì cho phép insert INSERT INTO PHANCONGCV (MAPHANCONG, MADA, MACV, MANV, VAITRO) SELECT MAPHANCONG, MADA, MACV, MANV, VAITRO FROM inserted; END GO -- Test trigger TRG_KIEMTRA_PHANCONG -- Thử insert phân công mới cho CV01 (DEADLINE=2024-02-15 < 2025-10-26, hiện 1 người) SELECT *FROM V_QUANLY_CONGVIEC INSERT INTO PHANCONGCV (MAPHANCONG, MADA, MACV, MANV, VAITRO) VALUES ('PC25', 'DA01', 'CV01', 'NV15', N'Hỗ trợ'); INSERT INTO PHANCONGCV (MAPHANCONG, MADA, MACV, MANV, VAITRO) --VALUES ('PC25', 'DA02', 'CV08', 'NV15', N'Hỗ trợ'); VALUES ('PC26', 'DA02', 'CV08', 'NV12', N'Hỗ trợ'), ('PC27', 'DA02', 'CV08', 'NV11', N'Hỗ trợ'), ('PC28', 'DA02', 'CV08', 'NV14', N'Hỗ trợ'), ('PC29', 'DA02', 'CV08', 'NV09', N'Hỗ trợ'); INSERT INTO PHANCONGCV (MAPHANCONG, MADA, MACV, MANV, VAITRO) VALUES('PC30', 'DA02', 'CV08', 'NV09', N'Hỗ trợ'); DELETE FROM PHANCONGCV WHERE MAPHANCONG='PC30' select * FROM PHANCONGCV DROP TRIGGER TRG_KIEMTRA_PHANCONG -- Thử insert cho CV16 (DEADLINE=2024-09-15 < 2025-10-26? Đợi, 2024-09-15 < 2025, nhưng nếu quá, lỗi; giả sử CV với DEADLINE tương lai nếu cần test OK) -- Để test vượt số lượng, giả sử thêm 5 người vào một CV mới, nhưng cần insert dần để trigger check. -- 7.6 Trigger tự động cập nhật ngày kết thúc dự án dựa trên công việc cuối cùng hoàn thành CREATE OR ALTER TRIGGER TRG_CAPNHAT_NGAYKT_DUAN ON CONGVIEC AFTER UPDATE AS BEGIN IF UPDATE(NGAYHT) AND (SELECT TRANGTHAI FROM inserted) = N'Hoàn thành' BEGIN DECLARE @MADA CHAR(10), @ALL_DONE INT, @MAX_NGAYHT DATE; SELECT @MADA = MADA FROM inserted; -- Kiểm tra tất cả công việc đã hoàn thành chưa SELECT @ALL_DONE = COUNT(MACV) - COUNT(CASE WHEN TRANGTHAI = N'Hoàn thành' THEN 1 END) FROM CONGVIEC WHERE MADA = @MADA; IF @ALL_DONE = 0 BEGIN SELECT @MAX_NGAYHT = MAX(NGAYHT) FROM CONGVIEC WHERE MADA = @MADA; UPDATE DUAN SET NGAYKTTHUCTE = @MAX_NGAYHT WHERE MADA = @MADA; PRINT N'Ngày kết thúc dự án được cập nhật dựa trên công việc cuối cùng!'; END END END GO -- Test trigger TRG_CAPNHAT_NGAYKT_DUAN -- Giả sử update công việc cuối của DA04 thành 'Hoàn thành' (đầu tiên update tất cả khác thành hoàn thành) SELECT *FROM CONGVIEC SELECT *FROM DUAN UPDATE CONGVIEC SET TRANGTHAI = N'Hoàn thành', NGAYHT = '2025-04-01' WHERE MACV = 'CV16'; UPDATE CONGVIEC SET TRANGTHAI = N'Hoàn thành', NGAYHT = '2025-04-01' WHERE MACV = 'CV17'; UPDATE CONGVIEC SET TRANGTHAI = N'Hoàn thành', NGAYHT = '2025-04-01' WHERE MACV = 'CV18'; UPDATE CONGVIEC SET TRANGTHAI = N'Hoàn thành', NGAYHT = '2025-04-01' WHERE MACV = 'CV19'; UPDATE CONGVIEC SET TRANGTHAI = N'Hoàn thành', NGAYHT = '2025-04-15' WHERE MACV = 'CV20'; -- update lại dữ liệu ban đầu UPDATE CONGVIEC SET TRANGTHAI = N'Đang thực hiện', NGAYHT = NULL WHERE MACV = 'CV16'; UPDATE CONGVIEC SET TRANGTHAI = N'Đang thực hiện', NGAYHT = NULL WHERE MACV = 'CV17'; UPDATE CONGVIEC SET TRANGTHAI = N'Chưa bắt đầu', NGAYHT = NULL WHERE MACV = 'CV18'; UPDATE CONGVIEC SET TRANGTHAI = N'Chưa bắt đầu', NGAYHT = NULL WHERE MACV = 'CV19'; UPDATE CONGVIEC SET TRANGTHAI = N'Chưa bắt đầu', NGAYHT = NULL WHERE MACV = 'CV20'; DROP TRIGGER TRG_CAPNHAT_NGAYKT_DUAN --------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------- CREATE DATABASE S01_QLKH USE S01_QLKH CREATE TABLE KHACHHANG (MAKH CHAR(10) NOT NULL PRIMARY KEY, TENKH NCHAR(50) NOT NULL, SOCCCD VARCHAR(15) NOT NULL, DIACHI NCHAR(50), DIENTHOAI VARCHAR(12) NOT NULL) SELECT *FROM KHACHHANG SELECT MAKH FROM KHACHHANG EXEC SP_HELPDB S01_QLKH EXEC SP_HELP KHACHHANG INSERT INTO KHACHHANG VALUES ('KH01' , N'NGUYỄN LAN QUYÊN', '001205003843', N'HÀ NỘI', '00356478676'), ('KH02' , N'P HẠM VĂN MINH', '001205004321', N'HÀ NỘI', '00356478677'), ('KH03', N'TRẦN THỊ MAI', '001205005678', N'ĐÀ NẴNG', '00356478678'), ('KH04', N'LÊ HOÀNG ANH', '001205006543', N'TP HỒ CHÍ MINH', '00356478679'), ('KH05', N'NGUYỄN VĂN BÌNH', '001205007890', N'CẦN THƠ', '00356478680'), ('KH06', N'ĐẶNG THU HẰNG', '001205008765', N'HẢI PHÒNG', '00356478681'), ('KH07', N'VŨ THỊ THU', '001205009432', N'QUẢNG NINH', '00356478682'), ('KH08', N'HOÀNG MINH CHÂU', '001205010987', N'NAM ĐỊNH', '00356478683'), ('KH09', N'NGUYỄN THỊ HỒNG', '001205011234', N'BẮC GIANG', '00356478684'), ('KH10', N'PHẠM THU TRANG', '001205012345', N'THANH HÓA', '00356478685') SELECT *FROM KHACHHANG WHERE DIACHI= N'HÀ NỘI' --DROP DATABASE S01_QLKH --DROP TABLE KHACHHANG SELECT COUNT(MAKH) AS SOKH FROM KHACHHANG CREATE TABLE LOAITK (MALOAI CHAR(10) NOT NULL PRIMARY KEY, TENLOAI NCHAR(50) NOT NULL, SONGAY INT NOT NULL, LOAITIEN NCHAR(10) NOT NULL, LAISUAT FLOAT); INSERT INTO LOAITK VALUES ('L01', N'Loại 1',30, N'VNĐ',0.5), ('L02', N'Loại 2',60, N'VNĐ',0.6), ('L03', N'Loại 3',90, N'VNĐ',0.8), ('L04', N'Loại 4',60, N'USĐ',0.2), ('L05', N'Loại 5',180, N'VNĐ',1.5); SELECT *FROM LOAITK SELECT *FROM LOAITK WHERE LOAITIEN= N'VNĐ' SELECT *FROM LOAITK WHERE LOAITIEN= N'USD' -----------------------------học tiếp 20/08/2025 CREATE TABLE HINHTHUC(MAHT CHAR(10) NOT NULL PRIMARY KEY, TENHT NCHAR(50) NOT NULL, GHICHU TEXT); INSERT INTO HINHTHUC VALUES ('HT01', N'Hình thức 1','Tra đầu kỳ'), ('HT02', N'Hình thức 2','Tra cuối kỳ'), ('HT03', N'Hình thức 3','Khuyến mai 1'), ('HT04', N'Hình thức 4','Khuyen mai 2'), ('HT05', N'Hình thức 6','Khuyen mai 1233'); SELECT *FROM HINHTHUC CREATE TABLE SOTK( MASO CHAR(10) NOT NULL PRIMARY KEY, MAKH CHAR(10) NOT NULL REFERENCES KHACHHANG(MAKH), SOTIENGUI FLOAT NOT NULL, MALOAI CHAR(10) NOT NULL REFERENCES LOAITK(MALOAI), NGAYGUI DATE NOT NULL, NGAYRUT DATE NOT NULL, MAHT CHAR(10) NOT NULL REFERENCES HINHTHUC(MAHT), TIENLAI FLOAT, SOTIENRUT FLOAT); SELECT *FROM SOTK INSERT INTO SOTK VALUES ('S01','KH01',100000,'L02','2020-3-2','2024-4-2','HT04', NULL, NULL), ('S02','KH02',105000,'L03','2020-4-10','2024-5-10','HT01', NULL, NULL), ('S03','KH03',98000,'L01','2021-1-15','2025-1-15','HT02', NULL, NULL), ('S04','KH04',120000,'L04','2019-6-1','2023-6-1','HT03', NULL, NULL), ('S05','KH05',110000,'L02','2020-12-12','2024-12-12','HT01', NULL, NULL), ('S06','KH06',102000,'L03','2021-8-20','2025-8-20','HT02', NULL, NULL), ('S07','KH07',95000,'L01','2019-11-30','2023-11-30','HT04', NULL, NULL), ('S08','KH08',99000,'L02','2020-5-5','2024-5-5','HT01', NULL, NULL), ('S09','KH09',115000,'L03','2021-3-3','2025-3-3','HT02', NULL, NULL), ('S10','KH10',108000,'L01','2020-7-7','2024-7-7','HT05', NULL, NULL); --DROP TABLE SOTK ALTER TABLE KHACHHANG ADD GHICHU NCHAR(100) ALTER TABLE KHACHHANG ADD GHICHU1 NCHAR(100) SELECT *FROM KHACHHANG --XÓA TRƯỜNG --ALTER TABLE KHACHHANG DROP COLUMN GHICHU1 --TINH LAI XUAT UPDATE SOTK SET SOTIENRUT= SOTIENGUI + SOTIENGUI*LAISUAT*SONGAY/360 FROM SOTK, LOAITK WHERE SOTK.MALOAI = LOAITK.MALOAI UPDATE SOTK SET TIENLAI= SOTIENGUI*LAISUAT+ SONGAY/360 FROM SOTK, LOAITK WHERE SOTK.MALOAI = LOAITK.MALOAI SELECT *FROM SOTK -- SUA LAI SO CCCD CUA KH CO MA KH02 UPDATE KHACHHANG SET SOCCCD= '0097686845555' WHERE MAKH= 'KH02' SELECT *FROM KHACHHANG ---XOA KH MA KH01 DELETE KHACHHANG WHERE MAKH='KH10' SELECT * FROM KHACHHANG, SOTK WHERE KHACHHANG.MAKH=SOTK.MAKH -- DEM CO BN SO TK SELECT COUNT (*) AS SO FROM SOTK -- DEM CO BN SOTK MALOAI L04 SELECT COUNT(*) AS SO FROM SOTK WHERE MALOAI= 'L04' -- CO BN SOTK HT CO MA HT01 SELECT COUNT(MASO) AS SOLUONG FROM SOTK WHERE MAHT='HT01' -- LIET KE SOTK CO TIENGUI MAX VA MIN SELECT *FROM SOTK WHERE SOTIENGUI= (SELECT MAX(SOTIENGUI) FROM SOTK) SELECT *FROM SOTK WHERE SOTIENGUI= (SELECT MIN(SOTIENGUI) FROM SOTK) -- LIET KE SOTK CO MUC LAISUAT MAX VA MIN SELECT *FROM SOTK, LOAITK WHERE SOTK.MALOAI= LOAITK.MALOAI AND LAISUAT=(SELECT MIN(LAISUAT) FROM LOAITK) --THONG TIN VE KH, HINH THUC, LOAI TK,SOTK SELECT *FROM SOTK, LOAITK, KHACHHANG, HINHTHUC WHERE SOTK.MAKH= KHACHHANG.MAKH AND SOTK.MALOAI = LOAITK.MALOAI AND SOTK.MAHT = HINHTHUC.MAHT --TINH LAI XUAT( LÀM TRÒN) UPDATE SOTK SET SOTIENRUT=ROUND( SOTIENGUI + SOTIENGUI*LAISUAT*SONGAY/360,2) FROM SOTK, LOAITK WHERE SOTK.MALOAI = LOAITK.MALOAI UPDATE SOTK SET TIENLAI= ROUND(SOTIENGUI*LAISUAT+ SONGAY/360,2) FROM SOTK, LOAITK WHERE SOTK.MALOAI = LOAITK.MALOAI SELECT *FROM SOTK -- XOA KH TRONG BANG KH CÓ MÃ KH08 DELETE KHACHHANG WHERE MAKH ='KH08' DELETE KHACHHANG WHERE MAKH ='KH100' SELECT *FROM KHACHHANG WHERE MAKH='KH100' -----------------NGAY 27/08/2025-------------------- CREATE VIEW V_LAUSUATMIN AS( SELECT MASO, MAKH, SOTIENGUI, SOTK.MALOAI, NGAYGUI, NGAYRUT, TENLOAI, SONGAY, LAISUAT FROM SOTK, LOAITK WHERE SOTK.MALOAI = LOAITK.MALOAI AND LAISUAT = (SELECT MIN(LAISUAT) FROM LOAITK)) SELECT *from V_LAUSUATMIN SELECT COUNT(*) AS TONGSO FROM V_LAUSUATMIN-- CO MUC LAI SUAT THAP CREATE OR ALTER VIEW V_TONGHOP_SOTK AS( SELECT KHACHHANG.MAKH, TENKH, SOCCCD, DIACHI,DIENTHOAI, HINHTHUC.MAHT, HINHTHUC.TENHT, MASO, SOTK.MALOAI, LAISUAT, NGAYGUI, NGAYRUT, SOTIENGUI, ROUND((SOTIENGUI*LAISUAT*SONGAY/360),2) AS TIENLAI, ROUND((SOTIENGUI + SOTIENGUI *LAISUAT*SONGAY/360),2) AS SOTIENRUT FROM SOTK, KHACHHANG, LOAITK, HINHTHUC WHERE KHACHHANG.MAKH=SOTK.MAKH AND SOTK.MALOAI =LOAITK.MALOAI AND SOTK.MAHT= HINHTHUC.MAHT) SELECT*FROM V_TONGHOP_SOTK SELECT*FROM V_TONGHOP_SOTK WHERE MAKH ='KH10' SELECT*FROM V_TONGHOP_SOTK WHERE MALOAI ='L04' --DROP VIEW V_TONGHOP_SOTK INSERT INTO SOTK VALUES ('S200', 'KH07', 45550000, 'L03', '2021-03-03', '2021-06-03', 'HT04', NULL, NULL), ('S201', 'KH08', 60000000, 'L02', '2021-04-01', '2021-07-01', 'HT05', NULL, NULL), ('S202', 'KH09', 35000000, 'L01', '2021-05-10', '2021-08-10', 'HT03', NULL, NULL); SELECT *FROM V_TONGHOP_SOTK SELECT *FROM SOTK SELECT COUNT(*) AS TONGSO FROM V_TONGHOP_SOTK -- CO BN SO TIEN GUI TK SELECT SUM(SOTIENGUI) AS TONGGUI, SUM(TIENLAI) AS TONGLAI, SUM(SOTIENRUT) AS TONGRUT FROM V_TONGHOP_SOTK --SOTIENGUI THE TUNG KH SELECT MAKH, SUM(SOTIENGUI) AS TONGGUI FROM V_TONGHOP_SOTK GROUP BY MAKH SELECT COUNT(DISTINCT MAKH) AS SOLUONG FROM V_TONGHOP_SOTK SELECT COUNT(MAKH) AS SOLUONG FROM V_TONGHOP_SOTK CREATE OR ALTER VIEW V_SOLUONG_THEONAM--VIEW THONG KE SOLUONG SOTK RUT THEO NAM AS SELECT YEAR(NGAYRUT) AS NAMRUT, COUNT(MASO) AS SOLUONG FROM SOTK GROUP BY YEAR (NGAYRUT) SELECT *FROM V_SOLUONG_THEONAM -- VIEW THONG KE SOLUONG SOTK THEO TUNG KH CREATE VIEW V_SOLUONG_THEOKH AS SELECT KHACHHANG.MAKH, TENKH, COUNT(MASO) AS SOLUONG FROM KHACHHANG, SOTK WHERE KHACHHANG.MAKH = SOTK.MAKH GROUP BY KHACHHANG.MAKH, TENKH SELECT *FROM V_SOLUONG_THEOKH; SELECT MAKH,TENKH, SUM(SOTIENGUI) AS TONGGUI FROM V_TONGHOP_SOTK GROUP BY MAKH, TENKH SELECT MAKH,TENKH, SOCCCD, DIACHI SUM(SOTIENGUI) AS TONGGUI FROM V_TONGHOP_SOTK GROUP BY MAKH, TENKH, SOCCCD, DIACHI HAVING SUM(SOTIENGUI) >= 14000000 -- LOC SAU KHI GROUPBY --VIEW TRONG VIEW CREATE OR ALTER VIEW v_NHOMKH AS( SELECT MAKH,TENKH, SUM(SOTIENGUI) AS TONGGUI FROM V_TONGHOP_SOTK GROUP BY MAKH, TENKH) SELECT *FROM V_NHOMKH WHERE TONGGUI >= 1400000 --VIEW THONGKE SOLUONG SOTK GUI THEO HT CREATE OR ALTER VIEW V_SOLUONG_THEOHT AS SELECT HINHTHUC.MAHT, TENHT, COUNT(MASO) AS SOLUONG FROM HINHTHUC, SOTK WHERE HINHTHUC.MAHT = SOTK.MAHT GROUP BY HINHTHUC.MAHT, TENHT; SELECT *FROM V_SOLUONG_THEOHT; --HINHTHUC NAO COS SOLUONG SOTK GUI NHIEU NHAT SELECT *FROM V_SOLUONG_THEOHT WHERE SOLUONG=(SELECT MAX(SOLUONG) FROM V_SOLUONG_THEOHT) --HINHTHUC GUI TK IT NHAT SELECT *FROM V_SOLUONG_THEOHT WHERE SOLUONG=(SELECT MIN(SOLUONG) FROM V_SOLUONG_THEOHT) ---------------------------------17/09/2025---------------------------------------------- --viet cac thu tuc them , sua, xoa ban ghi -- them khach hang SELECT *FROM LOAITK SELECT *FROM SOTK SELECT *FROM HINHTHUC SELECT *FROM KHACHHANG EXEC SP_HELP KHACHHANG CREATE OR ALTER PROC SP_THEMKH (@MA CHAR(10), @TEN NCHAR(100), @SOCCCD VARCHAR(15), @DIACHI NCHAR(100), @DIENTHOAI VARCHAR (12), @GHICHU NCHAR(200)) AS IF EXISTS (SELECT * FROM KHACHHANG WHERE MAKH = @MA) PRINT N'Khach hang nay da ton tai, vui long kiem tra lai' ELSE INSERT INTO KHACHHANG VALUES (@MA, @TEN, @SOCCCD, @DIACHI, @DIACHI,@GHICHU) GO --THEM SOTK EXEC SP_HELP SOTK CREATE OR ALTER PROC SP_THEMSOTK (@MASO CHAR(10),@MAKH CHAR(10),@SOTIENGUI FLOAT, @MALOAI CHAR(10), @NGAYGUI DATE, @NGAYRUT DATE, @MAHT CHAR(10), @TIENLAI FLOAT, @SOTIENRUT FLOAT) AS IF EXISTS (SELECT * FROM SOTK WHERE MASO= @MASO AND MAKH = @MAKH) PRINT N'Cap nhat nay da ton tai, vui long kiem tra lai' ELSE INSERT INTO SOTK VALUES (@MASO, @MAKH, @SOTIENGUI, @MALOAI, @NGAYGUI, @NGAYRUT, @MAHT, @TIENLAI, @SOTIENRUT) GO EXEC SP_HELP HINHTHUC CREATE OR ALTER PROC SP_THEMHT (@MAHT CHAR(10), @TENHT NCHAR(100), @GHICHU TEXT) AS IF EXISTS (SELECT * FROM HINHTHUC WHERE MAHT = @MAHT) PRINT N'Hinh thuc nay da ton tai, vui long kiem tra lai' ELSE INSERT INTO HINHTHUC VALUES (@MAHT, @TENHT, @GHICHU) GO EXEC SP_HELP LOAITK CREATE OR ALTER PROC SP_THEMLOAITK (@MALOAI CHAR(10), @TENLOAI NCHAR(100), @SONGAY INT, @LOAITIEN NCHAR(20), @LAISUAT FLOAT) AS IF EXISTS (SELECT * FROM LOAITK WHERE MALOAI = @MALOAI) PRINT N'Loai tiet kiem nay da ton tai, vui long kiem tra lai' ELSE INSERT INTO LOAITK VALUES (@MALOAI, @TENLOAI, @SONGAY, @LAISUAT,@LOAITIEN) GO --SUA BAN GHI CREATE OR ALTER PROC SP_CAPNHATKHACHHANG (@MA CHAR(10), @TEN NCHAR(100), @SOCCCD VARCHAR(15), @DIACHI NCHAR(100), @DIENTHOAI VARCHAR (12), @GHICHU NCHAR(200)) AS IF NOT EXISTS (SELECT * FROM KHACHHANG WHERE MAKH = @MA) PRINT N'Mã KH này không có trong hệ thống, xin vui lòng kiểm tra lại' ELSE UPDATE KHACHHANG SET TENKH=@TEN, SOCCCD= @SOCCCD, DIACHI= @DIACHI, DIENTHOAI= @DIENTHOAI, GHICHU= @GHICHU WHERE MAKH=@MA GO CREATE OR ALTER PROC SP_CAPNHATSOTK (@MASO CHAR(10),@MAKH CHAR(10),@SOTIENGUI FLOAT, @MALOAI CHAR(10), @NGAYGUI DATE, @NGAYRUT DATE, @MAHT CHAR(10), @TIENLAI FLOAT, @SOTIENRUT FLOAT) AS IF NOT EXISTS (SELECT * FROM SOTK WHERE MASO = @MASO AND MAKH=@MAKH) PRINT N'Mã SOTK này không có trong hệ thống, xin vui lòng kiểm tra lại' ELSE UPDATE SOTK SET SOTIENGUI=@SOTIENGUI, MALOAI= @MALOAI, NGAYGUI= @NGAYGUI, NGAYRUT=@NGAYRUT, MAHT=@MAHT, TIENLAI=@TIENLAI, SOTIENRUT=@SOTIENRUT WHERE MASO = @MASO AND MAKH=@MAKH GO -----------------ngày 8/10/2025-------------------------- -- Trigger tính lãi và số tiền rút khi thêm sổ tiết kiệm mới CREATE OR ALTER TRIGGER Trg_SOTK_TinhLai ON SOTK AFTER INSERT AS BEGIN UPDATE SOTK SET TIENLAI = ROUND(SOTK.SOTIENGUI * LOAITK.LAISUAT * LOAITK.SONGAY/360, 2), SOTIENRUT = ROUND(SOTK.SOTIENGUI + (SOTK.SOTIENGUI * LOAITK.LAISUAT * LOAITK.SONGAY/360), 2) FROM SOTK, LOAITK, INSERTED WHERE SOTK.MASO = INSERTED.MASO and INSERTED.MALOAI = LOAITK.MALOAI; END; SELECT * FROM SOTK WHERE TIENLAI IS NULL DELETE FROM SOTK WHERE TIENLAI IS NULL INSERT INTO SOTK VALUES('S0222','KH10',8000000,'L03','2024-3-3','2024-3-3','HT01',NULL,NULL); -- VIẾT TRIGER KHI SỬA LOẠI LOẠI, SỐ TIỀN GỬI THÌ TỰ ĐỘNG TÍNH LẠI LÃI SUẤT, SỐ TIỀN RÚT CREATE OR ALTER TRIGGER Trg_Sua_SOTK_TinhLai ON SOTK AFTER UPDATE AS BEGIN -- Chỉ chạy khi thay đổi loại tài khoản hoặc số tiền gửi IF (UPDATE(MALOAI) OR UPDATE(SOTIENGUI)) BEGIN UPDATE SOTK SET TIENLAI = ROUND(SOTK.SOTIENGUI * LOAITK.LAISUAT * LOAITK.SONGAY / 360, 2), SOTIENRUT = ROUND(SOTK.SOTIENGUI + (SOTK.SOTIENGUI * LOAITK.LAISUAT * LOAITK.SONGAY / 360), 2) FROM SOTK, LOAITK, INSERTED WHERE SOTK.MASO = INSERTED.MASO AND INSERTED.MALOAI = LOAITK.MALOAI; END END; GO UPDATE SOTK SET SOTIENGUI = 600000 WHERE MASO = 'S010'; UPDATE SOTK SET MALOAI = 'L03' WHERE MASO = 'S010'; ---- VIẾT TRIGGER MÀ KHI MUỐN DELETE NÓ KIỂM TRA MAKH CÓ ĐANG ĐC SD KO CREATE OR ALTER TRIGGER Trg_XOA_KHACHHANG ON KHACHHANG FOR DELETE AS BEGIN IF EXISTS (SELECT MAKH FROM SOTK WHERE MAKH IN (SELECT MAKH FROM deleted)) BEGIN PRINT(N'KO THE XOA KH DANG CO SOTK!'); RETURN; END ELSE BEGIN DELETE FROM KHACHHANG WHERE MAKH IN (SELECT MAKH FROM deleted); END END; SELECT *FROM KHACHHANG DELETE FROM KHACHHANG WHERE MAKH ='KH02' ---KTRA NGÀY RÚT KHI SỬA---------- CREATE OR ALTER TRIGGER Trg_KIEMTRA_NGAY_SOTK ON SOTK FOR INSERT, UPDATE AS BEGIN IF EXISTS (SELECT * FROM Inserted WHERE NGAYRUT < NGAYGUI) BEGIN PRINT (N'Ngày rút phải lớn hơn hoặc bằng ngày gửi!'); ROLLBACK TRANSACTION; END END; SELECT * FROM SOTK UPDATE SOTK SET NGAYRUT ='2021_01_01' WHERE MASO='S200' --------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------- CREATE DATABASE S01_QLSV USE S01_QLSV --Tạo bảng, input dữ liệu vào trong Bảng CREATE TABLE LOP(MALOP CHAR(10) PRIMARY KEY NOT NULL, TENLOP NVARCHAR(100), SOSV INT); CREATE TABLE SV(MASV CHAR(10) PRIMARY KEY NOT NULL, TENSV NVARCHAR(50), GIOITINH NCHAR(3), NGAYSINH DATE, MALOP CHAR(10) REFERENCES LOP(MALOP) NOT NULL, TINH NVARCHAR(100), HOCBONG FLOAT); SELECT * FROM LOP SELECT * FROM SV ---TẠO VIEW LIÊN QUAN 2 BẢNG CREATE OR ALTER VIEW V_THONGTINSV AS (SELECT MASV, TENSV, NGAYSINH, GIOITINH, TINH, HOCBONG, SV.MALOP, TENLOP, SOSV FROM SV, LOP WHERE SV.MALOP = LOP.MALOP) SELECT * FROM V_THONGTINSV INSERT INTO LOP (MALOP, TENLOP, SOSV) VALUES('TMDT61',N'Thương Mại Điện tử K61',0); INSERT INTO LOP VALUES('TMDT62',N'Thương Mại Điện tử K62',0); INSERT INTO LOP VALUES('TMDT63',N'Thương Mại Điện tử K63',10); INSERT INTO LOP VALUES('CNTT62A',N'Công nghệ thông tin 62A',0); INSERT INTO SV VALUES('SV01',N'Trần Ngọc Hùng',N'Nam','2001-5-12','TMDT62',N'Hà Nam',0); INSERT INTO SV VALUES('SV02',N'Lê Thị Hà',N'Nữ','2001-5-12','TMDT62',N'Hòa Bình',0); INSERT INTO SV VALUES('SV03',N'Trần Văn An',N'Nam','2001-5-12','TMDT62',N'Nam Định',0); INSERT INTO SV VALUES('SV04',N'Trần Thị Nhàn',N'Nữ','2001-5-12','TMDT61',N'Thái Nguyên',0); INSERT INTO SV VALUES('SV05',N'Nguyễn Thành An',N'Nam','2001-5-12','TMDT62',N'Lạng Sơn',0); SELECT * FROM SV, LOP WHERE SV.MALOP = LOP.MALOP SELECT MASV, TENSV, SV.MALOP, TENLOP FROM SV, LOP WHERE SV.MALOP = LOP.MALOP SELECT * FROM V_THONGTINSV SELECT COUNT(MALOP) as SOLOP FROM LOP SELECT COUNT(MASV) as SOSV FROM SV -- Tạo SV học lớp TMDT62 SELECT MASV, TENSV, SV.MALOP, TENLOP, GIOITINH FROM SV, LOP WHERE SV.MALOP = LOP.MALOP and SV.MALOP = 'TMDT62' SELECT * FROM V_THONGTINSV WHERE MALOP = 'TMDT62' SELECT MASV, TENSV, SV.MALOP, TENLOP FROM SV, LOP WHERE SV.MALOP = LOP.MALOP and TENLOP = N'Thương Mại Điện tử K61' SELECT MASV, TENSV, MALOP FROM SV WHERE MALOP = 'TMDT62' SELECT * FROM SV WHERE MALOP = 'TMDT62' DELETE FROM SV WHERE MASV = 'SV01' DELETE FROM LOP WHERE MALOP = 'CNTT62A' SELECT * FROM LOP DELETE FROM LOP WHERE MALOP = 'TMDT63' UPDATE SV SET MALOP = 'TMDT61' WHERE MASV = 'SV02' EXEC SP_HELPDB QLSV EXEC SP_HELP LOP EXEC SP_HELP SV --DROP TABLE SV ALTER TABLE SV ADD GHICHU VARCHAR(100); ALTER TABLE SV DROP COLUMN GHICHU; -- SỬA KIỂU DỮ LIỆU TRONG CỘT ALTER TABLE SV ALTER COLUMN TINH Nvarchar(200); --**************************************************** INSERT INTO SV VALUES('SV06',N'Nguyễn Thành',N'Nam','2001-5-12','TMDT62',N'Lạng Sơn',0,Null); CREATE TABLE MONHOC (MAMH CHAR(10) PRIMARY KEY NOT NULL, TENMH NVARCHAR(50), SOTC INT); CREATE TABLE KQDIEM(MASV CHAR(10) NOT NULL REFERENCES SV(MASV), MAMH CHAR(10) NOT NULL REFERENCES MONHOC(MAMH), DIEM1 FLOAT, DIEM2 FLOAT, DIEM3 FLOAT, DIEMHP FLOAT, PRIMARY KEY(MASV,MAMH)); -- InPut dữ liệu vào 2 bảng vừa tạo SELECT * FROM KQDIEM SELECT * FROM MONHOC SELECT * FROM SV SELECT * FROM LOP INSERT INTO SV VALUES('SV06',N'Nguyễn Thành',N'Nam','2003-7-12','TMDT63',N'Hà Nội',0); INSERT INTO SV VALUES('SV07',N'Nguyễn Thành',N'Nam','2003-6-12','TMDT63',N'Thanh Hóa',0); INSERT INTO SV VALUES('SV08',N'Nguyễn Thành',N'Nam','2003-5-10','TMDT63',N'Cao Bằng',0); INSERT INTO SV VALUES('SV09',N'Nguyễn Thành',N'Nam','2003-5-12','TMDT63',N'Ninh Bình',0); INSERT INTO SV VALUES('SV10',N'Nguyễn Thành',N'Nam','2001-5-12','TMDT62',N'Hải Phòng',0); INSERT INTO SV VALUES('SV11',N'Nguyễn Thành',N'Nam','2003-7-12','TMDT63',N'Hà Nội',0); INSERT INTO SV VALUES('SV12',N'Nguyễn Thành',N'Nam','2003-6-12','TMDT63',N'Thanh Hóa',0); INSERT INTO SV VALUES('SV13',N'Nguyễn Thành',N'Nam','2003-5-10','TMDT63',N'Cao Bằng',0); INSERT INTO SV VALUES('SV14',N'Nguyễn Thành',N'Nam','2003-5-12','TMDT63',N'Ninh Bình',0); INSERT INTO SV VALUES('SV15',N'Nguyễn Thành',N'Nam','2001-5-12','TMDT62',N'Hải Phòng',0); INSERT INTO MONHOC VALUES('TCC', N'Toán Cao cấp',3); INSERT INTO MONHOC VALUES('GDTC1', N'Giáo dục thể chất 1',2); INSERT INTO MONHOC VALUES('GDTC2', N'Giáo dục thể chất 2',3); INSERT INTO MONHOC VALUES('VLDC1',N'Vật lý đại cương 1',3); INSERT INTO MONHOC VALUES('TRR',N'Toán Rời Rạc',5); SELECT * FROM MONHOC INSERT INTO KQDIEM VALUES('SV01','TCC',7,9,7,0); SELECT * FROM KQDIEM UPDATE KQDIEM SET DIEMHP = DIEM1 * 0.1 + DIEM2 * 0.4 + DIEM3 * 0.5 INSERT INTO KQDIEM VALUES('SV02','TCC',10,9,5,0); INSERT INTO KQDIEM VALUES('SV03','TCC',9,9,7,0); INSERT INTO KQDIEM VALUES('SV04','TCC',8,10,7,0); INSERT INTO KQDIEM VALUES('SV05','TCC',5,9,7,0); --INSERT INTO KQDIEM VALUES('SV06','TCC',2,9,9,0); INSERT INTO KQDIEM VALUES('SV01','VLDC1',4,9,5,0); INSERT INTO KQDIEM VALUES('SV02','VLDC1',4,9,7,0); INSERT INTO KQDIEM VALUES('SV03','VLDC1',4,9,5,0); INSERT INTO KQDIEM VALUES('SV04','VLDC1',2,7,7,0); INSERT INTO KQDIEM VALUES('SV05','VLDC1',10,9,5,0); INSERT INTO KQDIEM VALUES('SV02','TCC',10,9,5,0); INSERT INTO KQDIEM VALUES('SV03','TCC',9,9,7,0); INSERT INTO KQDIEM VALUES('SV04','TCC',8,10,7,0); INSERT INTO KQDIEM VALUES('SV05','TCC',5,9,7,0); INSERT INTO KQDIEM VALUES('SV06','TCC',2,9,9,0); INSERT INTO KQDIEM VALUES('SV06','TCC',6,9,5,0); INSERT INTO KQDIEM VALUES('SV07','TCC',9,4,7,0); INSERT INTO KQDIEM VALUES('SV08','TCC',8,10,10,0); INSERT INTO KQDIEM VALUES('SV09','TCC',5,9,7,0); INSERT INTO KQDIEM VALUES('SV10','TCC',9,7,9,0); INSERT INTO KQDIEM VALUES('SV01','GDTC2',10,9,5,0); INSERT INTO KQDIEM VALUES('SV02','GDTC2',9,2,7,0); INSERT INTO KQDIEM VALUES('SV03','GDTC2',8,10,7,0); INSERT INTO KQDIEM VALUES('SV04','GDTC2',5,9,6,0); INSERT INTO KQDIEM VALUES('SV05','GDTC2',2,6,9,0); INSERT INTO KQDIEM VALUES('SV6','GDTC2',10,9,5,0); INSERT INTO KQDIEM VALUES('SV7','GDTC2',9,9,7,0); INSERT INTO KQDIEM VALUES('SV8','GDTC2',8,10,7,0); INSERT INTO KQDIEM VALUES('SV9','GDTC2',5,9,9,0); INSERT INTO KQDIEM VALUES('SV10','GDTC2',8,9,9,0); CREATE OR ALTER VIEW V_THONGTINDIEM (MASV, TENSV, GIOITINH, NGAYSINH, NOISINH, MALOP, TENLOP, MAMH, TENMH, SOTC, DIEM1, DIEM2, DIEM3, DIEMHP) AS SELECT SV.MASV,TENSV, GIOITINH, NGAYSINH,TINH, SV.MALOP,TENLOP, KQDIEM.MAMH,TENMH,SOTC,DIEM1,DIEM2,DIEM3, (DIEM1*0.1+DIEM2*0.4+ DIEM3*0.5)as DIEMHP FROM SV, LOP, MONHOC, KQDIEM WHERE SV.MALOP=LOP.MALOP AND KQDIEM.MASV=SV.MASV AND KQDIEM.MAMH=MONHOC.MAMH; SELECT * FROM V_THONGTINDIEM; -- Đếm có bn SV đăng ký học SELECT COUNT(DISTINCT (MASV)) as SOLUONG FROM V_THONGTINDIEM SELECT COUNT(*) FROM V_THONGTINDIEM; SELECT MASV, TENSV, SUM(SOTC) AS TONGSOTC FROM V_THONGTINDIEM GROUP BY MASV, TENSV SELECT MASV, TENSV, SUM(SOTC) AS TONGSOTC FROM V_THONGTINDIEM GROUP BY MASV, TENSV HAVING SUM(SOTC) >=6 -- CO BN SV DK HOC GDTC1 SELECT COUNT(MASV) AS SL FROM V_THONGTINDIEM WHERE MAMH='GDTC1' SELECT COUNT(MASV) AS SL FROM V_THONGTINDIEM WHERE MAMH='TCC' SELECT *FROM V_THONGTINDIEM -- SOLUONG SV THEO LOP DA DK HOC SELECT MALOP, TENLOP, COUNT(DISTINCT MASV) AS SOLUONG FROM V_THONGTINDIEM GROUP BY MALOP, TENLOP SELECT SV.MALOP, TENLOP, COUNT(DISTINCT MASV) AS SOLUONG FROM SV, LOP WHERE SV.MALOP = LOP.MALOP GROUP BY SV.MALOP, TENLOP -- THUC HANH THU TUC NGAY 10/09/2025 CREATE or ALTER PROC SP_HOTEN @TEN NVARCHAR(100) AS SELECT MASV ,TENSV FROM SV WHERE TENSV LIKE @TEN -- EXEC SP_HELP SV SELECT * FROM SV EXEC SP_HOTEN N'Trần Văn An' --XOA THU TUC --DROP PROC SP_HOTEN EXEC SP_HELPTEXT SP_HOTEN -- VIET THU TUC THEM BAN GHI VAO BANG MON HOC CREATE OR ALTER PROC SP_THEMMONHOC (@MA CHAR(10), @TEN NVARCHAR(10), @SOTC INT) AS IF EXISTS (SELECT *FROM MONHOC WHERE MAMH = @MA ) PRINT N'MA MON HOC NAY DA TON TAI XIN VUI LONG NHAP MA KHAC' ELSE INSERT INTO MONHOC VALUES(@MA, @TEN, @SOTC) GO EXEC SP_THEMMONHOC 'CD1', N'CHUYEN DE 1',2 SELECT *FROM MONHOC -- THU TUC XOA MONHOC CREATE OR ALTER PROC SP_XOAMONHOC (@MA CHAR(10)) AS IF NOT EXISTS (SELECT *FROM MONHOC WHERE MAMH = @MA ) PRINT N'MA MON HOC NAY KO CO TRONG HE THONG VUI LONG KTRA LAI' IF EXISTS (SELECT *FROM KQDIEM WHERE MAMH=@MA) PRINT N'MA MONHOC NAY DANG SD, KO THE XOA' ELSE DELETE MONHOC WHERE MAMH=@MA PRINT N'MA MH NAY DA DC XOA' GO EXEC SP_XOAMONHOC 'CD1' SELECT *FROM MONHOC -----VIET CAC THU TUC THEM BAN GHI TRONG BANG : SV, LOP, KQDIEM --THEM LOP CREATE OR ALTER PROC SP_THEMLOP @MALOP CHAR(10),@TENLOP NVARCHAR(100),@SOSV INT AS IF EXISTS (SELECT * FROM LOP WHERE MALOP = @MALOP) PRINT N'Mã lớp này đã tồn tại, vui lòng nhập mã khác!' ELSE INSERT INTO LOP(MALOP, TENLOP, SOSV) VALUES(@MALOP, @TENLOP, @SOSV) PRINT N'Thêm lớp thành công!' GO EXEC SP_THEMLOP 'KT63', N'Kế Toán 63', 0; SELECT *FROM LOP EXEC SP_HELP LOP -- THEM SV CREATE OR ALTER PROC SP_THEMSV @MASV CHAR(10),@TENSV NVARCHAR(50),@GIOITINH NCHAR(3),@NGAYSINH DATE, @MALOP CHAR(10),@TINH NVARCHAR(200),@HOCBONG FLOAT AS IF EXISTS (SELECT * FROM SV WHERE MASV = @MASV) PRINT N'Mã sinh viên đã tồn tại, vui lòng nhập mã khác!' ELSE IF NOT EXISTS (SELECT * FROM LOP WHERE MALOP = @MALOP) PRINT N'Mã lớp không tồn tại, vui lòng nhập lại!' ELSE INSERT INTO SV(MASV, TENSV, GIOITINH, NGAYSINH, MALOP, TINH, HOCBONG) VALUES(@MASV, @TENSV, @GIOITINH, @NGAYSINH, @MALOP, @TINH, @HOCBONG) PRINT N'Thêm sinh viên thành công!' GO EXEC SP_THEMSV 'SV20', N'Phạm Văn A', N'Nam', '2002-01-01', 'KT63', N'Hà Nội', 500000; SELECT *FROM SV EXEC SP_HELP KQDIEM --------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------- ----------- Bài toán Quản lý bán hàng------------------------------ Create Database S01_QLBH Use S01_QLBH EXEC sp_helpDB S01_QLBH CREATE table DMHANGHOA( MAHANG CHAR(10) not null Primary key, TENHANG NCHAR(80) not null, SOLUONGTON INT not null, DONGIA INT ); SELECT * FROM DMHANGHOA EXEC sp_help DMHANGHOA CREATE table HANGBAN( MABAN CHAR(10) not null Primary Key, MAHANG CHAR(10) references DMHANGHOA(MAHANG), NGAYBAN datetime, NGUOIBAN CHAR(50), SL_BAN INT not null, THANHTIEN INT ); SELECT * FROM HANGBAN EXEC sp_help HANGBAN --- NHẬP DỮ LIỆU PHÙ HỢP CHO CÁC BẢNG TRÊN (10-20 bản ghi) insert into DMHANGHOA values('HH1', 'Bia 33', 200, 100); insert into DMHANGHOA values('HH2', 'Bia HN', 600, 150); insert into DMHANGHOA values('HH3', 'Ruou 123', 200, 40); insert into DMHANGHOA values('HH4', 'Coca Cola 1', 30, 10); insert into DMHANGHOA values('HH5', 'Nuoc ngot 1', 400, 50); insert into DMHANGHOA values('HH6', 'Banh loai 1', 200, 100); insert into DMHANGHOA values('HH7', 'Banh loai 2', 600, 150); insert into DMHANGHOA values('HH8', 'Sua UC 1', 200, 400); insert into DMHANGHOA values('HH9', 'Sua DUC 2', 30, 100); insert into DMHANGHOA values('HH10', 'Yen Khanh Hoa', 40, 500) SELECT * FROM DMHANGHOA; insert into HANGBAN values('MB1', 'HH1', '12/12/2020', 'Hong', 20, Null); insert into HANGBAN values('MB2', 'HH2', '11/12/2020', 'Ha', 20, Null); insert into HANGBAN values('MB3', 'HH2', '12/12/2020', 'Nga', 10, Null); insert into HANGBAN values('MB4', 'HH3', '10/12/2020', 'Minh', 20, Null); insert into HANGBAN values('MB5', 'HH1', '09/12/2021', 'Hung', 30, Null); insert into HANGBAN values('MB6', 'HH1', '12/12/2021', 'Hong', 20, Null); insert into HANGBAN values('MB7', 'HH2', '11/12/2021', 'Ha', 20, Null); insert into HANGBAN values('MB8', 'HH2', '12/12/2021', 'Nga', 10, Null); insert into HANGBAN values('MB9', 'HH3', '10/12/2021', 'Minh', 20, Null); insert into HANGBAN values('MB10', 'HH1', '09/12/2021', 'Hung', 30, Null); SELECT * FROM HANGBAN; -- UPDATE TÍNH TIỀN UPDATE HANGBAN SET THANHTIEN = SL_BAN * DONGIA FROM DMHANGHOA, HANGBAN WHERE DMHANGHOA.MAHANG = HANGBAN.MAHANG; --TẠO VIEW CREATE OR ALTER VIEW V_TONGHOP AS SELECT DMHANGHOA.MAHANG, TENHANG,SOLUONGTON, DONGIA, MABAN, NGAYBAN, NGUOIBAN, SL_BAN, THANHTIEN= SL_BAN * DONGIA FROM DMHANGHOA, HANGBAN WHERE DMHANGHOA.MAHANG = HANGBAN.MAHANG SELECT *FROM V_TONGHOP SELECT *FROM V_TONGHOP WHERE MAHANG ='HH1' --BTVN: VIET THU TUC THEM, SUA , XOA DMHANGHOA, HANGBAN ----------------NGAY 01/10/2025--------------------- ----TRIGGER CREATE OR ALTER TRIGGER Trg_THEMHANGBAN ON HANGBAN FOR INSERT AS BEGIN -- Cập nhật số lượng tồn trong DMHANGHOA khi có đơn bán UPDATE DMHANGHOA SET SoLuongTon = SoLuongTon - ( SELECT SL_BAN FROM inserted WHERE inserted.MaHang = DMHANGHOA.MaHang ) FROM DMHANGHOA, inserted WHERE DMHANGHOA.MaHang = inserted.MaHang; -- Tính thành tiền cho HANGBAN UPDATE HANGBAN SET THANHTIEN = inserted.SL_BAN * DONGIA FROM DMHANGHOA, HANGBAN, inserted WHERE DMHANGHOA.MAHANG = HANGBAN.MAHANG AND HANGBAN.MABAN = inserted.MABAN; END GO SELECT *FROM DMHANGHOA SELECT *FROM HANGBAN DELETE FROM HANGBAN WHERE MABAN='MB200'; INSERT INTO HANGBAN VALUES('MB200', 'HH1','09/12/2021','HUNG',30,NULL) --DISABLE TRIGGER ON Table; -- ẨN TRIGGER --ENABLE TRIGGER ON Table; --HIỂN THỊ TRIGGER ---CẬP NHẬT SỐ LƯỢNG /* CẬP NHẬT HÀNG TRONG KHO SAU KHI ĐẶT HÀNG*/ CREATE TRIGGER Trg_CapNhatDatHang ON HANGBAN AFTER UPDATE AS BEGIN UPDATE DMHANGHOA SET SOLUONGTON = SOLUONGTON - (SELECT SL_BAN FROM inserted WHERE MAHANG = DMHANGHOA.MAHANG) + (SELECT SL_BAN FROM deleted WHERE MAHANG = DMHANGHOA.MAHANG) FROM DMHANGHOA, deleted WHERE DMHANGHOA.MAHANG = deleted.MAHANG; UPDATE HANGBAN SET THANHTIEN = SL_BAN * DONGIA FROM DMHANGHOA, HANGBAN WHERE DMHANGHOA.MAHANG = HANGBAN.MAHANG; END GO -- HUY DON HANG CREATE OR ALTER TRIGGER Trg_HuyDatHang ON HANGBAN FOR DELETE AS BEGIN UPDATE DMHANGHOA SET SoLuongTon = SoLuongTon + (SELECT SL_BAN FROM deleted WHERE MAHANG = DMHANGHOA.MAHANG) FROM DMHANGHOA, deleted WHERE DMHANGHOA.MAHANG = deleted.MAHANG; END GO --DISABLE TRIGGER ON HANGBAN; --ENABLE TRIGGER HANGBAN; SELECT *FROM HANGBAN SELECT *FROM DMHANGHOA --- CẬP NHẬT THÊM SỐ LƯỢNG HÀNG HÓA CÓ TRONG DANH MỤC CREATE OR ALTER PROC SP_DMHANGHOA_SL @MAHANG CHAR(10), @SOLUONG INT AS IF EXISTS (SELECT * FROM DMHANGHOA WHERE MAHANG= @MAHANG) UPDATE DMHANGHOA SET SOLUONGTON= SOLUONGTON + @SOLUONG WHERE MAHANG= @MAHANG ELSE PRINT N'THÔNG BÁO: MÃ HÀNG CHƯA CÓ TRING DANH MỤC' GO EXEC SP_DMHANGHOA_SL 'HH1',100 --THU TUC BAN HANG VÀ KIỂM TRA SỐ LUONGJ TỒN KHO TRONG DM CREATE OR ALTER PROC SP_THEMHANGBAN (@MABAN CHAR(10),@MAHANG CHAR(10), @NGAYBAN DATETIME, @NGUOIBAN CHAR(50), @SOLUONG INT) AS IF EXISTS (SELECT * FROM HANGBAN WHERE MABAN = @MABAN) PRINT N'Thông báo: Mã bán hàng này đã có'; ELSE IF NOT EXISTS (SELECT * FROM DMHANGHOA WHERE MAHANG = @MAHANG) PRINT N'Thông báo: Mã hàng này chưa có trong danh mục'; ELSE IF EXISTS (SELECT MAHANG, SOLUONGTON FROM DMHANGHOA WHERE MAHANG = @MAHANG AND SOLUONGTON < @SOLUONG) PRINT N'Thông báo: Số lượng mặt hàng này không đủ để bán'; ELSE INSERT INTO HANGBAN (MABAN, MAHANG, NGAYBAN, NGUOIBAN, SL_BAN) VALUES (@MABAN, @MAHANG, @NGAYBAN, @NGUOIBAN, @SOLUONG); PRINT N'Thêm đơn hàng thành công!'; GO EXEC SP_THEMHANGBAN 'MB100', 'HH1','12/12/2024', 'NGOC', 240 --------------btvn -- THÊM MẶT HÀNG CREATE OR ALTER PROC SP_THEM_DMHANGHOA @MAHANG CHAR(10), @TENHANG NCHAR(80), @SOLUONGTON INT, @DONGIA INT AS BEGIN IF EXISTS (SELECT * FROM DMHANGHOA WHERE MAHANG = @MAHANG) PRINT N'Mã hàng đã tồn tại!' ELSE BEGIN INSERT INTO DMHANGHOA VALUES(@MAHANG, @TENHANG, @SOLUONGTON, @DONGIA); PRINT N'Thêm mặt hàng thành công!'; END END GO -- SỬA MẶT HÀNG CREATE OR ALTER PROC SP_SUA_DMHANGHOA @MAHANG CHAR(10), @TENHANG NCHAR(80), @SOLUONGTON INT, @DONGIA INT AS BEGIN IF NOT EXISTS (SELECT * FROM DMHANGHOA WHERE MAHANG = @MAHANG) PRINT N'Mã hàng không tồn tại!' ELSE BEGIN UPDATE DMHANGHOA SET TENHANG = @TENHANG, SOLUONGTON = @SOLUONGTON, DONGIA = @DONGIA WHERE MAHANG = @MAHANG; PRINT N'Cập nhật thông tin mặt hàng thành công!'; END END GO -- XÓA MẶT HÀNG CREATE OR ALTER PROC SP_XOA_DMHANGHOA @MAHANG CHAR(10) AS BEGIN IF NOT EXISTS (SELECT * FROM DMHANGHOA WHERE MAHANG = @MAHANG) PRINT N'Mã hàng không tồn tại!' ELSE BEGIN DELETE FROM DMHANGHOA WHERE MAHANG = @MAHANG; PRINT N'Xóa mặt hàng thành công!'; END END GO -- THÊM HÀNG BÁN CREATE OR ALTER PROC SP_THEM_HANGBAN @MABAN CHAR(10), @MAHANG CHAR(10), @NGAYBAN DATETIME, @NGUOIBAN CHAR(50), @SL_BAN INT AS BEGIN IF EXISTS (SELECT * FROM HANGBAN WHERE MABAN = @MABAN) PRINT N'Mã bán đã tồn tại!' ELSE IF NOT EXISTS (SELECT * FROM DMHANGHOA WHERE MAHANG = @MAHANG) PRINT N'Mã hàng chưa tồn tại trong danh mục!' ELSE IF (SELECT SOLUONGTON FROM DMHANGHOA WHERE MAHANG = @MAHANG) < @SL_BAN PRINT N'Số lượng tồn kho không đủ!' ELSE BEGIN INSERT INTO HANGBAN (MABAN, MAHANG, NGAYBAN, NGUOIBAN, SL_BAN, THANHTIEN) SELECT @MABAN, @MAHANG, @NGAYBAN, @NGUOIBAN, @SL_BAN, @SL_BAN * DONGIA FROM DMHANGHOA WHERE MAHANG = @MAHANG; UPDATE DMHANGHOA SET SOLUONGTON = SOLUONGTON - @SL_BAN WHERE MAHANG = @MAHANG; PRINT N'Thêm đơn bán hàng thành công!'; END END GO -- SỬA HÀNG BÁN CREATE OR ALTER PROC SP_SUA_HANGBAN @MABAN CHAR(10), @SL_BAN INT AS BEGIN IF NOT EXISTS (SELECT * FROM HANGBAN WHERE MABAN = @MABAN) PRINT N'Mã bán không tồn tại!' ELSE BEGIN DECLARE @MAHANG CHAR(10), @SL_CU INT, @CHENHLECH INT; SELECT @MAHANG = MAHANG, @SL_CU = SL_BAN FROM HANGBAN WHERE MABAN = @MABAN; SET @CHENHLECH = @SL_BAN - @SL_CU; IF (SELECT SOLUONGTON FROM DMHANGHOA WHERE MAHANG = @MAHANG) < @CHENHLECH PRINT N'Số lượng tồn không đủ để cập nhật!' ELSE BEGIN UPDATE DMHANGHOA SET SOLUONGTON = SOLUONGTON - @CHENHLECH WHERE MAHANG = @MAHANG; UPDATE HANGBAN SET SL_BAN = @SL_BAN, THANHTIEN = @SL_BAN * DONGIA FROM DMHANGHOA WHERE DMHANGHOA.MAHANG = HANGBAN.MAHANG AND MABAN = @MABAN; PRINT N'Cập nhật đơn bán hàng thành công!'; END END END GO -- XÓA HÀNG BÁN CREATE OR ALTER PROC SP_XOA_HANGBAN @MABAN CHAR(10) AS BEGIN IF NOT EXISTS (SELECT * FROM HANGBAN WHERE MABAN = @MABAN) PRINT N'Mã bán không tồn tại!' ELSE BEGIN DECLARE @MAHANG CHAR(10), @SL_BAN INT; SELECT @MAHANG = MAHANG, @SL_BAN = SL_BAN FROM HANGBAN WHERE MABAN = @MABAN; DELETE FROM HANGBAN WHERE MABAN = @MABAN; UPDATE DMHANGHOA SET SOLUONGTON = SOLUONGTON + @SL_BAN WHERE MAHANG = @MAHANG; PRINT N'Xóa đơn bán hàng thành công!'; END END GO ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ CREATE DATABASE S01_QLCC USE S01_QLCC CREATE TABLE DONVI ( MADV VARCHAR(10) PRIMARY KEY, TENDV VARCHAR(50) NOT NULL, DIACHI VARCHAR(50) NOT NULL, -- DIENTHOAI_DV VARCHAR(10)NOT NULL CHECK (DIENTHOAI LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')) DIENTHOAI_NV VARCHAR(10)); CREATE TABLE NHANVIEN( MANV VARCHAR(10) PRIMARY KEY, MADV VARCHAR (10) NOT NULL FOREIGN KEY REFERENCES DONVI(MADV), HOTEN VARCHAR(30) NOT NULL, NGAYSINH SMALLDATETIME NOT NULL, GIOITINH VARCHAR(3) NOT NULL, DIACHI VARCHAR(50) NOT NULL, -- DIENTHOAI_NV VARCHAR(10)NOT NULL CHECK (DIENTHOAI LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), DIENTHOAI_NV VARCHAR(10), CHUCVU VARCHAR(30) NOT NULL) CREATE TABLE CHAMCONG( MANV VARCHAR(10) NOT NULL FOREIGN KEY REFERENCES NHANVIEN(MANV), THANG INT CHECK(THANG>0 AND THANG<13) NOT NULL, SONGAYCONG FLOAT CHECK (SONGAYCONG>=0 AND SONGAYCONG<=26) NOT NULL, SONGAYNGHICOPHEP FLOAT CHECK (SONGAYNGHICOPHEP>=0 AND SONGAYNGHICOPHEP<=10) NOT NULL) --PRIMARY KEY (MANV, THANG) -- insert du lieu INSERT INTO DONVI (MADV, TENDV, DIACHI, DIENTHOAI_NV) VALUES ('DV01', 'Phòng Hành Chính', 'Hà Nội', '0241111111'), ('DV02', 'Phòng Kế Toán', 'Hà Nội', '0242222222'), ('DV03', 'Phòng Nhân Sự', 'Hồ Chí Minh', '0283333333'), ('DV04', 'Phòng Kỹ Thuật', 'Đà Nẵng', '0236444444'), ('DV05', 'Phòng Kinh Doanh', 'Hà Nội', '0245555555'), ('DV06', 'Phòng Marketing', 'Hồ Chí Minh', '0286666666'), ('DV07', 'Phòng IT', 'Hà Nội', '0247777777'), ('DV08', 'Phòng Pháp Chế', 'Đà Nẵng', '0236788888'), ('DV09', 'Phòng Bảo Vệ', 'Hà Nội', '0249999999'), ('DV10', 'Phòng Kho Vận', 'Hải Phòng', '0225123456'); INSERT INTO NHANVIEN (MANV, MADV, HOTEN, NGAYSINH, GIOITINH, DIACHI, DIENTHOAI_NV, CHUCVU) VALUES ('NV01', 'DV01', 'Nguyen Van A', '1990-05-12', 'Nam', 'Hà Nội', '0911111111', 'Trưởng phòng'), ('NV02', 'DV01', 'Tran Thi B', '1992-08-20', 'Nữ', 'Hà Nội', '0922222222', 'Nhân viên'), ('NV03', 'DV02', 'Le Van C', '1988-03-15', 'Nam', 'Hà Nội', '0933333333', 'Kế toán trưởng'), ('NV04', 'DV02', 'Pham Thi D', '1995-11-02', 'Nữ', 'Hà Nội', '0944444444', 'Nhân viên'), ('NV05', 'DV03', 'Hoang Van E', '1987-07-07', 'Nam', 'Hồ Chí Minh', '0955555555', 'Trưởng phòng'), ('NV06', 'DV04', 'Do Thi F', '1993-09-09', 'Nữ', 'Đà Nẵng', '0966666666', 'Kỹ sư'), ('NV07', 'DV05', 'Bui Van G', '1991-01-21', 'Nam', 'Hà Nội', '0977777777', 'Nhân viên'), ('NV08', 'DV06', 'Nguyen Thi H', '1994-04-14', 'Nữ', 'Hồ Chí Minh', '0988888888', 'Chuyên viên'), ('NV09', 'DV07', 'Pham Van I', '1989-12-30', 'Nam', 'Hà Nội', '0999999999', 'Quản trị hệ thống'), ('NV10', 'DV08', 'Tran Thi J', '1996-06-25', 'Nữ', 'Đà Nẵng', '0901234567', 'Luật sư'); INSERT INTO CHAMCONG (MANV, THANG, SONGAYCONG, SONGAYNGHICOPHEP) VALUES ('NV01', 1, 24, 2), ('NV02', 1, 22, 1), ('NV03', 1, 26, 0), ('NV04', 1, 20, 3), ('NV05', 1, 25, 1), ('NV06', 1, 23, 2), ('NV07', 1, 21, 1), ('NV08', 1, 24, 0), ('NV09', 1, 26, 0), ('NV10', 1, 22, 2); DELETE FROM CHAMCONG; SELECT * FROM NHANVIEN; SELECT * FROM CHAMCONG; SELECT * FROM DONVI; CREATE OR ALTER VIEW V_LUONGCB1 --- SỐ NHÂN VIÊN CÓ NGHỈ PHÉP AS SELECT NHANVIEN.MANV, NHANVIEN.HOTEN, NHANVIEN.MADV, TENDV,THANG, SONGAYCONG, SONGAYNGHICOPHEP, (SONGAYCONG*200000 + SONGAYNGHICOPHEP*100000) AS 'TIEN_LUONG' FROM NHANVIEN, CHAMCONG WHERE NHANVIEN.MANV=CHAMCONG.MANV AND SONGAYNGHICOPHEP>0 GO CREATE OR ALTER VIEW V_LUONGCB2 -- SỐ NHÂN VIÊN KHÔNG NGHỈ PHÉP AS SELECT NHANVIEN.MANV, NHANVIEN.HOTEN, NHANVIEN.MADV, THANG, SONGAYCONG, SONGAYNGHICOPHEP, (SONGAYCONG*2500000) AS 'TIEN_LUONG' FROM NHANVIEN, CHAMCONG WHERE NHANVIEN.MANV=CHAMCONG.MANV AND SONGAYNGHICOPHEP=0 GO SELECT * FROM V_LUONGCB1 SELECT * FROM V_LUONGCB2 -- Viết câu lệnh, cho biết thu nhập (tổng lương) theo từng đơn vị. SELECT MADV, TENDV, SUM(TIEN_LUONG) AS TONG FROM V_LUONGCB GROUP BY MADV, TENDV; SELECT MADV, TENDV, SUM(TIEN_LUONG) AS TONG FROM V_LUONGCB2 GROUP BY MADV, TENDV; --Câu 1: Viết thủ tục sửa thông tin chấm công, kiểm tra các ràng buộc --Update Chamcong, set thang=@thang, songaycong=@sonc, songaynghicophep=@sonp where manv=manv CREATE OR ALTER PROC SP_SUACHAMCONG @MANV VARCHAR(10), @THANG INT, @SONC FLOAT, @SONP FLOAT AS BEGIN IF NOT EXISTS (SELECT * FROM CHAMCONG WHERE @MANV=MANV) PRINT 'MA NHAN VIEN KHONG TON TAI' ELSE IF (@THANG<0 OR @THANG>12) PRINT 'THANG KHONG HOP LE. MOI NHAP LAI THANG' ELSE IF (@SONC>26) PRINT 'SO NGAY CONG KHONG HOP LE. SO NGAY QUA 26 NGAY' ELSE IF (@SONP>10) PRINT 'SO NGAY NGHI KHONG HOP LE. SO NGAY NHO HON 10' ELSE UPDATE CHAMCONG SET THANG=@THANG, SONGAYCONG=@SONC, SONGAYNGHICOPHEP=@SONP WHERE @MANV=MANV END EXEC SP_SUACHAMCONG 'NV03', 1, 22, 5 EXEC SP_SUACHAMCONG 'NV02', 1, 22, 5 SELECT * FROM CHAMCONG --- VIẾT TRIGGER TRONG BÀI CREATE OR ALTER TRIGGER Trg_TinhTien_CHAMCONG ON CHAMCONG AFTER INSERT, UPDATE AS BEGIN -- Cập nhật TIENLUONG cho các nhân viên vừa chấm công UPDATE CHAMCONG SET TIENLUONG = INSERTED.SONGAYCONG * 200000 + INSERTED.SONGAYNGHICOPHEP * 150000 FROM CHAMCONG, INSERTED WHERE CHAMCONG.MANV = INSERTED.MANV AND CHAMCONG.THANG = INSERTED.THANG END; SELECT *FROM CHAMCONG INSERT INTO CHAMCONG(MANV,THANG, SONGAYCONG,SONGAYCONG) VALUES ('NV1',1,25,0) SELECT *FROM NHANVIEN SELECT *FROM DONVI --THÊM CỘT SỐ LƯỢNG TRONG BẢNG ĐVI ALTER TABLE DONVI ADD SOLUONG INT -- UPDATE SỐ LƯỢNG NV THEO TỪNG ĐV CREATE OR ALTER FUNCTION F_SONV (@MADV CHAR(10)) RETURNS INT BEGIN DECLARE @SOLUONG INT; SET @SOLUONG =(SELECT COUNT(MANV) FROM NHANVIEN WHERE MADV=@MADV); RETURN @SOLUONG; END; UPDATE DONVI SET SOLUONG=DBO.F_SONV(MADV) SELECT *FROM DONVI CREATE OR ALTER PROC SP_TINHTIEN @OPTION INT, @MA VARCHAR(10), @THANG INT AS BEGIN IF(@OPTION =1) SELECT NHANVIEN.MANV, NHANVIEN.HOTEN, NHANVIEN.MADV, THANG, SONGAYCONG, SONGAYNGHICOPHEP, (SONGAYCONG *200000 + SONGAYNGHICOPHEP * 100000) AS 'TIEN LUONG' FROM NHANVIEN, CHAMCONG WHERE NHANVIEN.MANV=CHAMCONG.MANV AND @MA=NHANVIEN.MANV AND @THANG = THANG IF(@OPTION=2) SELECT NHANVIEN.MANV, NHANVIEN.HOTEN, NHANVIEN.MADV, THANG, SONGAYCONG, SONGAYNGHICOPHEP, (SONGAYCONG*200000+SONGAYNGHICOPHEP*100000) AS 'TIEN LUONG' FROM NHANVIEN, CHAMCONG WHERE NHANVIEN.MANV = CHAMCONG.MANV AND @MA=NHANVIEN.MADV AND @THANG=THANG ELSE PRINT 'LUA CHON KHONG HOP LE! XIN VUI LONG CHON LAI' END EXEC SP_TINHTIEN 1, 'NV05',1 EXEC SP_TINHTIEN 2, 'DV02', 1 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ CREATE DATABASE SQL5_TranDuyAnh_01 USE SQL5_TranDuyAnh_01 --CÂU 1 --a) CREATE TABLE PHONGBAN( MAPB CHAR(10) NOT NULL PRIMARY KEY, TENPB NVARCHAR(30) NOT NULL, DIACHI NVARCHAR(100) NOT NULL, SODT VARCHAR(15) NOT NULL, CHUCNANG NVARCHAR(30) NOT NULL, SONV INT NOT NULL DEFAULT 0 ); CREATE TABLE CHUCVU( MACV CHAR(10) NOT NULL PRIMARY KEY, TENCV NVARCHAR(30) NOT NULL, HESOCV FLOAT NOT NULL, GHICHU NVARCHAR(300) ); CREATE TABLE NHANVIEN( MANV CHAR(10) NOT NULL PRIMARY KEY, HOTEN NVARCHAR(30) NOT NULL, NGAYSINH DATE NOT NULL, GIOITINH CHAR(10) NOT NULL, NOISINH NVARCHAR(30) NOT NULL, HSL FLOAT NOT NULL, MAPB CHAR(10) FOREIGN KEY REFERENCES PHONGBAN(MAPB), MACV CHAR(10) FOREIGN KEY REFERENCES CHUCVU(MACV), ); CREATE TABLE QUATRINH( MAQT CHAR(10) NOT NULL PRIMARY KEY, MANV CHAR(10) NOT NULL FOREIGN KEY REFERENCES NHANVIEN(MANV), TUNGAY DATE NOT NULL, DENNGAY DATE, VITRI NVARCHAR(100) NOT NULL, GHICHU NVARCHAR(300) ); CREATE TABLE LUONG( MALUONG CHAR(10) NOT NULL PRIMARY KEY, THANGNAM VARCHAR(15) NOT NULL, MANV CHAR(10) NOT NULL FOREIGN KEY REFERENCES NHANVIEN(MANV), LUONGCB FLOAT NOT NULL, KHOAN1 FLOAT NOT NULL, KHOAN2 FLOAT NOT NULL, TONGLINH FLOAT NOT NULL DEFAULT 0 ); --b) INSERT INTO PHONGBAN (MAPB, TENPB, DIACHI, SODT, CHUCNANG) VALUES ('PB01', N'Hành chính', N'Hà Nội', '02437890001', N'Quản trị nhân sự'), ('PB02', N'Kế toán', N'Hồ Chí Minh', '02437890002', N'Hạch toán tài chính'); INSERT INTO CHUCVU VALUES ('CV01', N'Nhân viên', 1.0, NULL), ('CV02', N'Trưởng phòng', 1.5, NULL); INSERT INTO NHANVIEN VALUES ('NV01', N'Trần Duy Anh', '1995-05-10', N'Nam', N'Hà Nội', 2.34, 'PB01', 'CV01'), ('NV02', N'Lương Quang Huy', '1993-09-20', N'Nam', N'Hải Phòng', 3.00, 'PB02', 'CV01'), ('NV03', N'Lê Trung Đức', '1994-04-10', N'Nam', N'Thanh Hóa', 2.50, 'PB02', 'CV02'), ('NV04', N'Kim Linh Chi', '2000-4-30', N'Nữ', N'Hải Phòng', 2.80, 'PB01', 'CV02'); UPDATE PHONGBAN SET SONV = (SELECT COUNT(*) FROM NHANVIEN WHERE NHANVIEN.MAPB= PHONGBAN.MAPB); INSERT INTO QUATRINH VALUES ('QT01','NV01', '2024-01-01', NULL, N'Trưởng phòng hành chính', NULL), ('QT02','NV02', '2024-01-01', NULL, N'Trưởng phòng kế toán', NULL), ('QT03','NV03', '2024-02-01', NULL, N'Nhân viên kế toán', NULL), ('QT04','NV04', '2024-02-01', NULL, N'Nhân viên hành chính', NULL); INSERT INTO LUONG (MALUONG, THANGNAM, MANV, LUONGCB, KHOAN1, KHOAN2) VALUES ('L01','01-2024','NV01',6000000,500000,200000), ('L02','01-2024','NV02',7000000,600000,300000), ('L03','01-2024','NV03',3000000,450000,180000), ('L04','01-2024','NV04',3800000,400000,150000); --c) SELECT * FROM NHANVIEN EXEC SP_HELP NHANVIEN SELECT * FROM QUATRINH EXEC SP_HELP QUATRINH --CÂU 2 --a) CREATE OR ALTER VIEW V_TongHop12 AS SELECT NHANVIEN.MANV, HOTEN, NGAYSINH, GIOITINH, NOISINH, HSL, MAPB, NHANVIEN.MACV, MALUONG, THANGNAM, LUONGCB, KHOAN1, KHOAN2, (LUONGCB*(HSL + HESOCV) +KHOAN1 - KHOAN2) AS TONGTIENLINH FROM NHANVIEN , LUONG, CHUCVU WHERE NHANVIEN.MANV= LUONG.MANV AND NHANVIEN.MACV = CHUCVU.MACV SELECT * FROM V_TongHop12 --b) SELECT * FROM V_TongHop12 ORDER BY TONGTIENLINH --CÂU 3 --a) CREATE OR ALTER PROC SP_THEMPHONGBAN @MAPB CHAR(10), @TENPB NVARCHAR(30), @DIACHI NVARCHAR(100), @SODT VARCHAR(15), @CHUCNANG NVARCHAR(30) AS BEGIN IF EXISTS (SELECT * FROM PHONGBAN WHERE @MAPB = MAPB) PRINT(N'PHÒNG BAN ĐÃ TỒN TẠI'); ELSE BEGIN INSERT INTO PHONGBAN(MAPB, TENPB, DIACHI, SODT, CHUCNANG) VALUES (@MAPB, @TENPB, @DIACHI, @SODT, @CHUCNANG); PRINT('THÊM PHÒNG BAN THÀNH CÔNG'); END END GO EXEC SP_THEMPHONGBAN 'PB03', 'NHAN SU', 'HCM', '012345678', 'QUAN LY NHAN SU' SELECT * FROM PHONGBAN DELETE PHONGBAN WHERE MAPB = 'PB03' --b) CREATE OR ALTER PROC SP_XOATTQUATRINH @MAQT CHAR(10) AS BEGIN IF NOT EXISTS (SELECT * FROM QUATRINH WHERE MAQT = @MAQT) PRINT('QÚA TRÌNH KHÔNG TỒN TẠI'); ELSE BEGIN DELETE QUATRINH WHERE MAQT = @MAQT; PRINT('XÓA QT THÀNH CÔNG'); END END GO SELECT * FROM QUATRINH EXEC SP_XOATTQUATRINH 'QT04' --CÂU 4 --- SELECT * FROM LUONG SELECT * FROM PHONGBAN SELECT * FROM CHUCVU SELECT * FROM V_TongHop12 EXEC SP_THONGKELUONG 2, '01-2024' --- CREATE OR ALTER PROC SP_THONGKELUONG @LUACHON INT, @THANGNAM VARCHAR(15) AS BEGIN IF @LUACHON = 1 BEGIN SELECT PHONGBAN.MAPB, TENPB, ISNULL(SUM(TONGTIENLINH),0) AS TONGLUONG FROM PHONGBAN, V_TongHop12 WHERE PHONGBAN.MAPB = V_TongHop12.MAPB AND @THANGNAM = THANGNAM GROUP BY PHONGBAN.MAPB,TENPB END ELSE IF @LUACHON = 2 BEGIN SELECT CHUCVU.MACV, TENCV, ISNULL(SUM(TONGTIENLINH),0) AS TONGLUONG FROM CHUCVU, V_TongHop12 WHERE CHUCVU.MACV = V_TongHop12.MACV AND @THANGNAM = THANGNAM GROUP BY CHUCVU.MACV, TENCV END ELSE PRINT ('LỰA CHỌN SAI (CHỈ 1 HOẶC 2)'); END GO --CÂU 5 CREATE OR ALTER TRIGGER Trg_Tinhtoan15 ON LUONG AFTER INSERT, UPDATE AS BEGIN UPDATE LUONG SET TONGLINH = LUONGCB*(HSL + HESOCV) + KHOAN1 - KHOAN2 FROM LUONG, NHANVIEN, CHUCVU WHERE NHANVIEN.MANV = LUONG.MANV AND CHUCVU.MACV = NHANVIEN.MACV END GO SELECT * FROM LUONG SELECT * FROM V_TongHop12 UPDATE LUONG SET KHOAN1 = 500000 WHERE MALUONG ='L01' CREATE OR ALTER PROC SP_THONGKE_NHAPXUAT @OPTION INT AS BEGIN IF (@OPTION = 1) SELECT PHIEUNHAP.SOPHIEU_N AS 'SỐ PHIẾU NHẬP', PHIEUNHAP.MANCC AS 'MÃ NHÀ CUNG CẤP', NHACUNGCAP.TENNCC AS 'TÊN NHÀ CUNG CẤP', PHIEUNHAP.MAHANG AS 'MÃ HÀNG', HANGHOA.TENHANG AS 'TÊN HÀNG', PHIEUNHAP.SL_NHAP AS 'SỐ LƯỢNG NHẬP', PHIEUNHAP.NGAYNHAP, YEAR(PHIEUNHAP.NGAYNHAP) AS 'NĂM NHẬP', PHIEUNHAP.TIEN_NHAP AS 'TIỀN NHẬP' FROM PHIEUNHAP, NHACUNGCAP, HANGHOA WHERE PHIEUNHAP.MANCC = NHACUNGCAP.MANCC AND PHIEUNHAP.MAHANG = HANGHOA.MAHANG; ELSE IF (@OPTION = 2) SELECT PHIEUXUAT.SOPHIEU_X AS 'SỐ PHIẾU XUẤT', PHIEUXUAT.MAKH AS 'MÃ KHÁCH HÀNG', KHACHHANG.TENKH AS 'TÊN KHÁCH HÀNG', PHIEUXUAT.MAHANG AS 'MÃ HÀNG', HANGHOA.TENHANG AS 'TÊN HÀNG', PHIEUXUAT.SL_XUAT AS 'SỐ LƯỢNG XUẤT', PHIEUXUAT.NGAYXUAT, YEAR(PHIEUXUAT.NGAYXUAT) AS 'NĂM XUẤT', PHIEUXUAT.TIEN_XUAT AS 'TIỀN XUẤT' FROM PHIEUXUAT, KHACHHANG, HANGHOA WHERE PHIEUXUAT.MAKH = KHACHHANG.MAKH AND PHIEUXUAT.MAHANG = HANGHOA.MAHANG; ELSE PRINT N'LỰA CHỌN KHÔNG HỢP LỆ! VUI LÒNG NHẬP 1 (NHẬP) HOẶC 2 (XUẤT).'; END