Professional Documents
Culture Documents
mẫu dbi202
mẫu dbi202
5. Tính tổng doanh thu theo từng tháng trong năm 2015.
SELECT MONTH(Pick_up_date) AS Month, SUM(Amount) AS Total_Revenue FROM Rentals
WHERE YEAR(Pick_up_date) = 2015
GROUP BY MONTH(Pick_up_date)
ORDER BY Month
10. Liệt kê các đơn đặt xe có tổng chi phí trên 200 đô la.
SELECT * FROM Rentals WHERE Amount > 200
11.Tìm top 3 khách hàng có tổng số lượng đơn đặt xe nhiều nhất và sắp xếp theo
alphabet tên khách hàng.
SELECT TOP 3 c.First_Name, c.Last_Name, COUNT(r.Customer_ID) AS Num_Orders FROM
Customers c INNER JOIN Rentals r ON c.ID = r.Customer_ID
GROUP BY c.First_Name, c.Last_Name
ORDER BY Num_Orders DESC, c.Last_Name, c.First_Name
2. Liệt kê các mẫu xe được thuê ít nhất 3 lần, sắp xếp theo số lượng lần đặt giảm dần.
SELECT c.Model, COUNT(r.CarID) AS Rented_Count FROM Cars c INNER JOIN Rentals r ON
c.ID = r.CarID GROUP BY c.Model HAVING COUNT(r.CarID) >= 3 ORDER BY Rented_Count
DESC
3. Tìm khách hàng có chi phí trung bình cho mỗi lần thuê xe cao nhất.
SELECT TOP 1 c.First_Name, c.Last_Name, AVG(r.Amount) AS Avg_Amount FROM
Customers c INNER JOIN Rentals r ON c.ID = r.Customer_ID GROUP BY c.First_Name,
c.Last_Name ORDER BY Avg_Amount DESC
4. Tính tổng doanh thu theo từng quý của năm 2015.
SELECT DATEPART(quarter, Pick_up_date) AS Quarter, SUM(Amount) AS Total_Revenue
FROM Rentals WHERE YEAR(Pick_up_date) = 2015 GROUP BY DATEPART(quarter,
Pick_up_date)
5. Tìm các khách hàng chưa thuê xe mẫu Chevrolet Sonic.
SELECT c.* FROM Customers c WHERE NOT EXISTS ( SELECT * FROM Rentals r INNER JOIN
Cars ca ON ca.ID = r.CarID WHERE ca.Model = 'Sonic' AND c.ID = r.Customer_ID )
6. Liệt kê các địa điểm có cả số điện thoại chính và phụ.
SELECT l.* FROM Location l INNER JOIN Location_Phone_Number lpn ON l.ID =
lpn.Location_ID WHERE EXISTS ( SELECT * FROM Location_Phone_Number WHERE
Location_ID = l.ID AND Is_MainPhone = 1 ) AND EXISTS ( SELECT * FROM
Location_Phone_Number WHERE Location_ID = l.ID AND Is_MainPhone = 0
)
7. Tìm các khách hàng chưa từng thuê xe tại địa điểm có mã ID là 5.
SELECT c.* FROM Customers c WHERE NOT EXISTS ( SELECT * FROM Rentals r WHERE c.ID
= r.Customer_ID AND r.Pick_up_location = 5 )
8. Liệt kê các mẫu xe được thuê với tần suất tăng dần theo năm.
WITH Rented_Cars AS ( SELECT YEAR(Pick_up_date) AS Rental_Year, CarID, COUNT(CarID)
AS Rent_Count FROM Rentals GROUP BY YEAR(Pick_up_date), CarID ) SELECT c.Model,
Rental_Year, Rent_Count FROM Rented_Cars rc INNER JOIN Cars c ON rc.CarID = c.ID
ORDER BY c.Model, Rental_Year
9. Tìm địa điểm có số lượng điện thoại nhiều nhất.
SELECT TOP 1 l.ID, COUNT(lpn.ID) AS Num_Phones FROM Location l LEFT JOIN
Location_Phone_Number lpn ON l.ID = lpn.Location_ID
GROUP BY l.ID ORDER BY Num_Phones DESC
10. Tìm các khách hàng chưa từng đặt xe dưới 30 ngày.
SELECT c.* FROM Customers c WHERE NOT EXISTS ( SELECT * FROM Rentals r WHERE c.ID
= r.Customer_ID AND DATEDIFF(day, Pick_up_date, Return_date) < 30 )
PROCEDURE,trigger,view
1. Tạo một stored procedure để thêm một khách hàng mới vào bảng Customers.
CREATE PROCEDURE spAddNewCustomer @FirstName nvarchar(100), @LastName
nvarchar(100), @Email nvarchar(100), @Phone nvarchar(20), @State nvarchar(100),
@Country nvarchar(100)
AS
INSERT INTO Customers (First_Name, Last_Name, Email, Mobile_phone, State, Country)
VALUES (@FirstName, @LastName, @Email, @Phone, @State, @Country)
2. Tạo trigger để tự động cập nhật trường Return_location trong bảng Rentals bằng
Pick_up_location khi không nhập Return_location.
CREATE TRIGGER trgAutoUpdateReturnLocation ON Rentals AFTER INSERT AS BEGIN
UPDATE Rentals SET Return_location = Pick_up_location WHERE Return_location IS NULL
END
3. Tạo view để lấy ra thông tin các khách hàng đã từng đặt xe, bao gồm các trường:
Tên, Email, Số điện thoại, Quốc gia.
CREATE VIEW vCustomerRentedCars AS SELECT c.First_Name, c.Last_Name, c.Email,
c.Mobile_phone, c.Country FROM Customers c INNER JOIN Rentals r ON c.ID =
r.Customer_ID
4. Tạo stored procedure có đầu vào là mã khách hàng và trả về tổng số lượng lần khách
hàng đó đã thuê xe.
CREATE PROCEDURE spGetRentalCountByCustomer @CustomerID int
AS
BEGIN SELECT COUNT(*) AS TotalRentals FROM Rentals WHERE Customer_ID =
@CustomerID
END
5. Tạo trigger để tự động cập nhật trường Category_ID trong bảng Cars dựa trên giá trị
của Brand và Model.
CREATE TRIGGER trgAutoUpdateCategory ON Cars AFTER INSERT, UPDATE AS BEGIN
UPDATE
Cars SET Category_ID = CASE WHEN Brand = 'Chevrolet' AND Model IN ('Spark', 'Sonic')
THEN 2 WHEN Brand = 'Toyota' AND Model IN ('Yaris', 'Aygo') THEN 4 ELSE 1 END WHERE
Category_ID IS NULL END
6. Tạo view để lấy ra doanh thu theo từng tháng của năm 2014.
CREATE VIEW vRevenueByMonth2014 AS SELECT DATENAME(month, Pick_up_date) AS
Month, SUM(Amount) AS TotalRevenue FROM Rentals WHERE YEAR(Pick_up_date) = 2014
GROUP BY DATENAME(month, Pick_up_date)
7. Viết stored procedure có đầu vào là mã khách hàng và xóa thông tin khách hàng đó
khỏi bảng Customers.
CREATE PROCEDURE spDeleteCustomer @CustomerID int AS BEGIN DELETE FROM
Customers WHERE ID = @CustomerID END
8. Tạo trigger để khi xóa một đơn đặt xe, cũng xóa luôn các bản ghi liên quan trong
bảng Rentals.
CREATE TRIGGER trgDeleteRelatedRentals ON Rentals AFTER DELETE AS BEGIN DELETE
FROM Rentals WHERE Customer_ID IN (SELECT Customer_ID FROM deleted) AND CarID IN
(SELECT CarID FROM deleted) AND Pick_up_location IN (SELECT Pick_up_location FROM
deleted) AND Return_location IN (SELECT Return_location FROM deleted) END
9. Tạo view lấy ra thông tin các đơn đặt xe bao gồm: Mã đơn, Tên khách hàng, Ngày
thuê, Ngày trả, Mã xe.
CREATE VIEW vRentalDetails AS SELECT r.Reservation_Number, c.First_Name + ' ' +
c.Last_Name AS CustomerName, r.Pick_up_date, r.Return_date, r.CarID
FROM Rentals r JOIN Customers c ON r.Customer_ID = c.ID
10. Viết stored procedure có đầu vào là mã khách hàng, cập nhật email của khách hàng
đó trong bảng Customers.
CREATE PROCEDURE spUpdateCustomerEmail @CustomerID int, @Email nvarchar(100) AS
BEGIN UPDATE Customers SET Email = @Email WHERE ID = @CustomerID
END
1. Tạo stored procedure để lấy ra thông tin của 5 khách hàng có chi tiêu cao nhất.
CREATE PROCEDURE spTop5CustomersBySpending AS BEGIN SELECT TOP 5 * FROM
Customers c INNER JOIN Rentals r ON c.ID = r.Customer_ID GROUP BY c.ID ORDER BY
SUM(r.Amount) DESC END
2. Viết trigger cập nhật tự động trường Return_date trong bảng Rentals bằng ngày hôm
nay nếu Return_date để trống.
CREATE TRIGGER trgUpdateReturnDate ON Rentals AFTER INSERT AS BEGIN UPDATE
Rentals SET Return_date = GETDATE() WHERE Return_date IS NULL END
3. Tạo view để lấy ra tổng doanh thu theo từng tháng trong năm 2015.
CREATE VIEW vRevenueByMonth2015 AS SELECT DATENAME(month, Pick_up_date) AS
Month, YEAR(Pick_up_date) AS Year, SUM(Amount) AS TotalRevenue FROM Rentals WHERE
YEAR(Pick_up_date) = 2015 GROUP BY DATENAME(month, Pick_up_date),
YEAR(Pick_up_date)
4. Viết stored procedure có đầu vào là mã khách hàng, cập nhật số điện thoại của
khách hàng trong bảng Customers.
CREATE PROCEDURE spUpdateCustomerPhone @CustomerID int, @Phone nvarchar(20) AS
BEGIN UPDATE Customers SET Mobile_phone = @Phone WHERE ID = @CustomerID END
5. Tạo trigger để ngăn chặn việc xóa bản ghi khỏi bảng Location nếu địa điểm đó đã
được sử dụng trong bảng Rentals.
CREATE TRIGGER trgRestrictDeleteLocation ON Location INSTEAD OF DELETE AS BEGIN IF
EXISTS (SELECT * FROM deleted d INNER JOIN Rentals r ON d.ID = r.Pick_up_location OR
d.ID = r.Return_location) BEGIN RAISERROR('Cannot delete location used in rentals', 16, 1)
ROLLBACK TRANSACTION END END
6. Tạo view bao gồm các thông tin: Mã đơn đặt xe, tên khách hàng, mã xe, ngày thuê,
ngày trả.
CREATE VIEW vRentalDetails AS SELECT r.Reservation_Number, c.First_Name + ' ' +
c.Last_Name AS CustomerName, r.CarID, r.Pick_up_date, r.Return_date FROM Rentals r JOIN
Customers c ON r.Customer_ID = c.ID
7. Viết stored procedure để xóa toàn bộ dữ liệu khỏi bảng Location_Phone_Number.
CREATE PROCEDURE spTruncateLocationPhones AS BEGIN TRUNCATE TABLE
Location_Phone_Number END
8. Tạo trigger không cho phép cập nhật hoặc xóa bản ghi khỏi bảng Cars nếu xe đó
đang được thuê.
CREATE TRIGGER trgRestrictUpdateDeleteCars ON Cars INSTEAD OF UPDATE, DELETE AS
BEGIN IF EXISTS (SELECT * FROM deleted d INNER JOIN Rentals r ON d.ID = r.CarID) BEGIN
RAISERROR('Cannot update/delete rented car', 16, 1) ROLLBACK TRANSACTION END
END
9. Viết stored procedure có đầu vào là mã khách hàng, xóa khách hàng đó khỏi bảng
Customers.
CREATE PROCEDURE spDeleteCustomer @CustomerID int AS BEGIN DELETE FROM
Customers WHERE ID = @CustomerID END
10. Tạo view lấy ra các đơn đặt xe có tổng chi phí lớn hơn 500.
CREATE VIEW vExpensiveRentals AS SELECT * FROM Rentals WHERE Amount > 500
1. Viết trigger để tự động tính giá cho thuê xe dựa trên số ngày thuê, loại xe và áp dụng
chiết khấu cho khách hàng thân thiết.
CREATE TRIGGER trgCalculateRentalPrice ON Rentals AFTER INSERT, UPDATE AS BEGIN
UPDATE Rentals SET Amount = DATEDIFF(DAY, Pick_up_date, Return_date) * c.DailyRate *
CASE WHEN c.Category = 'Luxury' THEN 1.2 WHEN EXISTS (SELECT 1 FROM
FrequentRenters WHERE CustomerID = Customer_ID) THEN 0.9 ELSE 1 END FROM Cars c
WHERE c.ID = CarID END
2. Viết stored procedure để tìm khách hàng có số lần đặt xe nhiều nhất ở mỗi quốc gia.
CREATE PROCEDURE spTopCustomerByCountry AS BEGIN SELECT c.Country,
MAX(RentalCount) AS MaxRentals, FIRST_VALUE(c.FirstName) OVER (PARTITION BY
c.Country ORDER BY RentalCount DESC) AS TopCustomer FROM ( SELECT c.Country,
c.FirstName, COUNT(*) AS RentalCount FROM Customers c INNER JOIN Rentals r ON c.ID =
r.CustomerID GROUP BY c.Country, c.FirstName ) c GROUP BY c.Country END
3. Viết trigger để ngăn chặn việc chỉnh sửa bản ghi trong bảng Rentals nếu đơn đặt xe
đó đã quá hạn trả.
CREATE TRIGGER trgRestrictUpdateOverdueRental ON Rentals INSTEAD OF UPDATE AS
BEGIN IF EXISTS (SELECT 1 FROM inserted i INNER JOIN Rentals r ON
i.Reservation_Number = r.Reservation_Number WHERE r.Return_Date < GETDATE()) BEGIN
RAISERROR('Cannot update overdue rental', 16, 1) ROLLBACK TRANSACTION END END
4. Tạo view để lấy ra các đơn đặt xe có ngày trả xe sau ngày dự kiến.
CREATE VIEW vOverdueRentals AS SELECT * FROM Rentals WHERE Return_Date >
Expected_Return_Date
5. Viết stored procedure để xóa toàn bộ dữ liệu của bảng Cars và cập nhật lại ID tự
động tăng.
CREATE PROCEDURE spResetCars AS BEGIN TRUNCATE TABLE Cars
DBCC CHECKIDENT ('Cars', RESEED, 0) END
6. Tạo trigger không cho phép xóa khách hàng nếu khách hàng đó vẫn còn đơn đặt xe
chưa trả.
CREATE TRIGGER trgRestrictDeleteCustomer ON Customers INSTEAD OF DELETE AS BEGIN
IF EXISTS (SELECT * FROM deleted d INNER JOIN Rentals r ON d.ID = r.Customer_ID WHERE
r.Return_Date IS NULL) BEGIN RAISERROR('Cannot delete customer with active rentals', 16,
1) ROLLBACK TRANSACTION
END END
7. Viết stored procedure để lấy ra doanh thu hàng tháng của 1 năm bất kỳ.
CREATE PROCEDURE spRevenueByMonth @Year int AS BEGIN SELECT DATENAME(month,
Pickup_Date) AS Month, SUM(Amount) AS Revenue FROM Rentals WHERE
YEAR(Pickup_Date) = @Year GROUP BY DATENAME(month, Pickup_Date) END
8. Tạo trigger cập nhật tự động trạng thái Đã trả cho đơn đặt xe khi ngày trả xe nhỏ hơn
hoặc bằng ngày hiện tại.
CREATE TRIGGER trgUpdateRentalStatus ON Rentals AFTER UPDATE AS BEGIN UPDATE
Rentals SET Status = 'Returned' WHERE Return_Date <= GETDATE() END
9. Viết view để lấy ra các đơn đặt xe đã quá hạn nhưng vẫn chưa được trả.
CREATE VIEW vOverdueRentals AS SELECT * FROM Rentals WHERE Return_Date <
GETDATE() AND Status = 'Active'
10. Tạo stored procedure để xóa toàn bộ dữ liệu trong các bảng Rentals, Cars và
Customers.
CREATE PROCEDURE spDeleteAllData AS BEGIN DELETE FROM Rentals DELETE FROM Cars
DELETE FROM Customers END