ĐỀ BÀI
Bài 1:
Viết hàm tính số lần giao dịch và tổng số lượng đã đặt mua (purchase), bán ra (sale), đặt làm (order) của 1 sản phẩm được cho bởi mã sản phẩm
Bài 2:
Tạo 1 bảng rỗng đặt tên là Bike_Transaction có cấu trúc giống bảng TransactionHistory.
Tạo trigger để ghi lại toàn bộ giao dịch bán hàng liên quan đến xe đạp vào 1 bảng vừa tạo. Trình tự thực hiện như sau:
- Tạo trigger liên quan đến lệnh Insert của bảng SaleOrderDetail. Kiểm tra nếu sản phẩm là Xe đạp thì ghi vào bảng Bike_Transaction (Lưu ý: Có thể cùng lúc phát sinh nhiều hàng mới trong bảng SaleOrderDetail)
- Kiểm tra trigger bằng cách viết lệnh chèn cùng lúc 3 hàng vào bảng SaleOrderDetail, trong đó có 2 hàng liên quan đến xe đạp.
- Kiểm tra kết quả trong bảng Bike_Transaction
Bài 3:
Bảng Store có trường Name là tên cửa hàng. Bảng này kết nối với bảng BusinessEntityContact cho biết thông tin người đại diện cửa hàng.
Viết hàm trả về danh sách các đại lý có nhu cầu nhận email tiếp thị của
công ty. Yêu cầu cụ thể:
- Hàm có tên DS_gui_email, trả về danh sách đại lý có nhu cầu nhận email của cửa hàng theo mẫu sau:

- Tương tự xây dựng hàm trả về danh sách các cửa hàng không có nhu cầu nhận email tiếp thị
Bài 4:
Viết hàm trả về danh sách các khách hàng lẻ tiềm năng của cửa hàng (là
những khách có tiền mua trung bình > tiền mua bình quân của tất cả khách
hàng lẻ)
BÀI SỬA
Bài 1:
-- CÓ 3 LOẠI GIAO DICH:
-- W = WorkOrder, S = SalesOrder, P = PurchaseOrder
SELECT DISTINCT [TransactionType] FROM [Production].[TransactionHistory]
--
CREATE FUNCTION dbo.fn_soGiaoDich(@MaSP int)
RETURNs TABLE
AS
RETURN (
SELECT [ProductID], [TransactionType],
SUM([Quantity]) AS tongSL,
COUNT(*) AS SoLanGD
FROM [Production].[TransactionHistory]
WHERE [ProductID] = @MaSP
GROUP BY [ProductID], [TransactionType]
)
--Test
SELECT * FROM dbo.fn_soGiaoDich(327)Bài 2:
-- Tạo bảng rỗng cấu trúc giống Bike_Transaction
SELECT *
INTO Bike_Transaction
FROM [Production].[TransactionHistory]
WHERE 1 = 2 --Only create Structure
CREATE TRIGGER trg_check_bike
ON [Sales].[SalesOrderDetail]
AFTER INSERT
AS
SET IDENTITY_INSERT [dbo].[Bike_Transaction] ON
INSERT [dbo].[Bike_Transaction] ([TransactionID],
[ProductID],
[ReferenceOrderID],
[ReferenceOrderLineID],
[TransactionDate],
[TransactionType],
[Quantity],
[ActualCost],
[ModifiedDate])
SELECT (SELECT ISNULL(MAX([TransactionID]), 0) + 1 FROM [dbo].[Bike_Transaction]),
i.[ProductID],
i.[SalesOrderID],
i.[SalesOrderDetailID],
GETDATE(),
'S',
i.[OrderQty],
i.[UnitPrice],
GETDATE()
FROM inserted i
JOIN [Production].[Product] P ON P.ProductID = i.ProductID
JOIN [Production].[ProductSubcategory] PS
ON P.ProductSubcategoryID = PS.ProductSubcategoryID
JOIN [Production].[ProductCategory] PC
ON PC.ProductCategoryID = PS.ProductCategoryID
WHERE PC.[Name] = 'Bikes'
SET IDENTITY_INSERT [dbo].[Bike_Transaction] OFF
-- tim san pham xe dap
SELECT p.ProductID, p.Name
FROM [Production].[Product] p
JOIN [Production].[ProductSubcategory] s ON s.ProductSubcategoryID = p.ProductSubcategoryID
JOIN [Production].[ProductCategory] c ON c.ProductCategoryID = s.ProductCategoryID
WHERE c.[Name] = 'Bikes'
GO
----
-- Giả sử:
-- Chọn sản phẩm xe đạp mã 760
-- Tìm hóa đơn muốn nhập thêm xe đạp mới
SELECT *
FROM [Sales].[SalesOrderDetail]
WHERE SalesOrderID = 43661
-- AND [ProductID] = 760
ORDER BY SalesOrderID DESC
-- SET IDENTITY_INSERT [dbo].[Bike_Transaction] ON ▶ Đưa vào trong TRIGGER tránh lỗi khởi tạo
-- "Cannot insert the value NULL into column 'TransactionID', ..." ▶ Bảng SalesOrderDetail đang NULL -> Sử lý ISNULL
INSERT [Sales].[SalesOrderDetail] ([SalesOrderID], [OrderQty], [ProductID], [SpecialOfferID],
[UnitPrice], [UnitPriceDiscount])
VALUES (43661, 10, 760, 1, 350, 0)Bài 3:
CREATE FUNCTION DS_gui_Email()
RETURNS TABLE
AS
RETURN
(
SELECT s.Name AS 'Ten cua hang',
[FirstName] + ' ' + [MiddleName] + ' ' + [LastName] AS 'Ho Ten NV',
[EmailAddress]
FROM [Sales].[Store] S
JOIN [Person].[BusinessEntityContact] BEC ON BEC.BusinessEntityID = S.BusinessEntityID
JOIN [Person].[Person] P ON P.BusinessEntityID = BEC.PersonID
JOIN [Person].[EmailAddress] EA ON EA.BusinessEntityID = P.BusinessEntityID
WHERE [EmailPromotion] = 0 -- Thay thành 1
)
-- Test
SELECT *
FROM dbo.DS_gui_Email()Bài 4:
CREATE FUNCTION DSKhachTiemnang()
RETURNS @DSKhach TABLE
(
MaKhach INT,
Tenkhach NVARCHAR(50),
TongTien MONEY
)
AS
BEGIN
DECLARE @dsbq MONEY =
(SELECT AVG(SOH.[TotalDue])
FROM [Sales].[SalesOrderHeader] SOH
JOIN [Person].[Person] P ON P.BusinessEntityID = SOH.CustomerID
WHERE P.[PersonType] = 'IN')
----
-- SC = Store Contact,
-- IN = Individual (retail) customer,
-- SP = Sales person,
-- EM = Employee (non-sales),
-- VC = Vendor contact,
-- GC = General contact
INSERT @DSKhach (MaKhach, Tenkhach, TongTien)
SELECT P.[BusinessEntityID],
P.[FirstName] + ' ' + P.[MiddleName] + ' ' + P.[LastName],
AVG(SOH.[TotalDue])
FROM [Sales].[SalesOrderHeader] SOH
JOIN [Person].[Person] P ON P.BusinessEntityID = SOH.CustomerID
WHERE [PersonType] = 'IN' --Khach hàng lẻ
GROUP BY P.[BusinessEntityID], P.[FirstName], P.[MiddleName], P.[LastName]
HAVING AVG([TotalDue]) > @dsbq
RETURN
END
-- Test
SELECT *
FROM dbo.DSKhachTiemnang()