Đề tài nhóm
Giới thiệu về chủ đề Order management
- Quản lý đơn hàng (order management) là việc quản lý các quy trình kinh doanh liên quan đến đơn hàng cho hàng hóa hoặc dịch vụ Order management bắt đầu khi khách hàng đặt hàng và kết thúc khi họ nhận được gói hoặc dịch vụ của họ Nó cho phép một doanh nghiệp điều phối toàn bộ quá trình thực hiện – từ thu thập đơn hàng, tồn kho và khả năng giao hàng đến khả năng cung cấp dịch vụ
- Quy trình công việc liên quan có thể khác nhau dựa trên nhu cầu của công ty, nhưng quy trình quản lý đơn hàng điển hình bao gồm ba bước:
• Placement (đặt hàng): Khách hàng đặt hàng thông qua một hình thức tự động Một thành viên nhóm bán hàng kiểm tra các chi tiết và xác nhận đơn hàng
• Fulfillment ( xử lý): Một nhân viên kho xác nhận chi tiết vận chuyển, tạo hóa đơn và hoàn thành đơn hàng – chọn, đóng gói và vận chuyển.
• Inventory management (quản lý tồn kho): Mức tồn kho được theo dõi khi chúng dao động với nhu cầu của doanh nghiệp
- Vai trò của order management:
• Quản lý đơn hàng có liên quan hầu như mọi hệ thống và quy trình trong chuỗi cung ứng Nó liên quan đến nhiều đối tác như nhà cung cấp linh kiện và linh kiện, dịch vụ lắp ráp và đóng gói hoặc trung tâm phân phối, khiến cho việc mất khả năng hiển thị và kiểm soát đơn hàng trở nên dễ dàng
• Quản lý đơn hàng có tác động trực tiếp đến cách khách hàng cảm nhận về doanh nghiệp hoặc thương hiệu Trong một môi trường đa kênh, khách hàng mong đợi một trải nghiệm liền mạch Một khách hàng có thể đặt hàng trực tuyến nhưng có câu hỏi và hoàn thành đơn đặt hàng thông qua một trung tâm cuộc gọi.
Thông tin cơ sở dữ liệu
- Cơ sở dữ liệu gồm 71 bảng và có kích thước là 336.00mb
Schema Các đối tượng liên quan Ví dụ Số bảng
HumanResources Nhân viên công ty Adventure
Person Thông tin của khách hàng, nhà cung cấp và nhân viên Contact Table
Production Các sản phẩm được sản xuất và bán bởi công ty
Purchasing Các nhà cung cấp Vender Table 5
Sales Các khách hàng và dữ liệu liên quan đến việc mua bán Customer Table
2.4 Đánh giá mức độ chuẩn hóa của CSDL
- Chuẩn 1 ( 1NF ): o Không có cột nào chứa các thuộc tính đa trị o Không có cột nào có thể được tính toán từ các cột khác o CSDL là chuẩn 1
- Chuẩn 2 ( 2NF ): o thỏa mãn điều kiện là chuẩn 1 o Các thuộc tính không khóa đều phụ thuộc hàm đầy đủ vào khóa chính o CSDL là chuẩn 2
- Chuẩn 3 ( 3 NF ) o thỏa mãn điều kiện là chuẩn 2 o Không có phụ thuộc hàm gián tiếp ( phụ thuộc hàm bắc cầu) o CSDL là chuẩn 3
- Chuẩn Boyce Codd ( BCNF ) o thỏa mãn điều kiện là chuẩn 3 o Không tồn tại thuộc tính khóa phụ thuộc hàm vào thuộc tính không khóa o CSDL là chuẩn Boyce Codd
- Sau khi đánh giá mức độ chuẩn hóa, ta thấy CSDL đạt đến chuẩn Boyce Codd.
Truy v n d li u 7 ấ ữ ệ 1 Chi tiết các câu truy vấn
Tối ưu truy vấn
1 Chi tiết các câu truy vấn
1 Sản phẩm có id >t7 và có LocationID 0 hoặc ActuaResourceHrs bắt đầu bằng 4
SELECT LocationID ,count(*)Profuct_ID
WHERE ActualResourceHrs like '4%' LocationID ='30' or
GROUP BY LocationID HAVING count(*)>= 747;
2 Tính số tiền bán được và tính sự thay đổi của đơn hàng order theo DueDate +Câu lệnh:
OrderQty -LAG (ReceivedQty ,1)OVER (ORDER BY DueDate )AS Order_delta ,
3 Product ID có mức độ an toàn nhỏ hơn mức độ an toàn trung bình
WITH SafetyStockLevel ProductID ( , VALUE AS)
SafetyStockLevel.VALUE SafetyStockLevel_avg< VALUE;
4 Lap bang bao cao so san pham ban duoc va con lai trong kho theo thoi gian +, Câu lệnh:
DATEDIFF day ( ,'2011-06-03 00:00:00.000', DueDate date_diff )as ,
CASE when DATEDIFF (day,'2011-06-03 00:00:00.000', DueDate ) andDATEDIFF (day ,'2011-06-03 00:00:00.000', DueDate ) and DATEDIFF (day ,'2011-06-03 00:00:00.000', DueDate ) andDATEDIFF (day ,'2011-06-03 00:00:00.000', DueDate ) 100, show ra bảng gồm 2 cột SalesOrderDetailID (giảm dần) +, Câu lệnh:
FROM [Sales] [SalesOrderDetail]sod join [Sales] [SalesOrderHeader]soh on soh.SalesOrderID=sod.SalesOrderID join [Sales] [SpecialOfferProduct]sop on sop.ProductID=sod.ProductID join [Sales] [Customer]c on c.CustomerID=soh.CustomerID join [Person] [Person] per on per.BusinessEntityID c= CustomerID
WHERE soh TaxAmt 100 > and sod ProductID in (774 714 709 712,711,762 758 745 743,747 712 715) , , , , , , , , and soh OrderDate between'2013-09-30 00:00:00'and'2014-06-30 00:00:00' and soh CustomerID > 18529
6 Liệt kê s n phả ẩm có lượng đặt hàng nhi u nh t ề ấ
+, Câu lệnh: use [AdventureWorks2019] select top 1 a.ProductID, b.Name from [Sales] [SalesOrderDetail] a left join
[Production] [Product] b on b.ProductID=a.ProductID group by a.ProductID,b.Name having sum(a.OrderQty 1000 )> order bysum(a.OrderQty)DESC;
7 Tìm ki m nhế ững đơn hàng có thu >500 và id s n ph m là 760 ho c 770 ế ả ẩ ặ ,ngày t hàng tđặ ừ năm 2011 đến 2012 và có khách hàng n m vùng lãnh th Ainằ ở ổ hoặc có người bán hàng có id 277, show bảng sx SaleOrderID giảm dần
+, Câu lệnh: select a.[SalesOrderID] a [ProductID] b [CustomerID] b SalesPersonID , , , from [Sales] [SalesOrderDetail] a left join [Sales] [SalesOrderHeader] b on b.[SalesOrderID]=a.[SalesOrderID] where b.TaxAmt>500 and
(a.ProductIDv0 aor ProductIDw0) and (b.OrderDate BETWEEN '2011-01-01 00:00:00.000'and '2012-01-01 00:00:00.000') b CustomerID and in( select c CustomerID
[Sales] [Customer] d from left join [Sales] [SalesOrderHeader] c on d.CustomerID=c.CustomerID
[Person] [StateProvince] e e [TerritoryID] left join on
=d.[TerritoryID] e c where Name='Ain' or SalesPersonID'7)
8./* truy van nhung san pham co so luong tra ve nhieu trong top 10 */
+, Câu lệnh: use [AdventureWorks2019] select top 10 a.ProductID, b.Name, sum(a.RejectedQty) as tong_don_tra_ve from [Purchasing] [PurchaseOrderDetail] a left join [Production] [Product] b on b ProductID =a.ProductID where a.RejectedQty>0 group by a.ProductID, b.Name order by tong_don_tra_ve DESC;
9./* truy van id khach hang có so don dat lớn hơn 5 co ngay dat hang tu nam 2011 den 2013 */
+, Câu lệnh: use [AdventureWorks2019] select a.PersonID, count(b SalesOrderID ) as so_don_hang from [Sales] [Customer] a left join [Sales] [SalesOrderHeader] b on b CustomerID=a CustomerID where (b.OrderDate BETWEEN '2011-01-01' AND '2013-12-31') group by a PersonID having count(b SalesOrderID ) > 5 order by a PersonID
10./* truy v n t ng s tiấ ổ ố ền đơn hàng , ngày đặt, id khach hàng, s tài kho n c a ố ả ủ khách hàng của các đơn hàng */
+, Câu lệnh: use [AdventureWorks2019] select a.SalesOrderID, b.OrderDate, b.CustomerID, c.AccountNumber, tong_tien sum(a.orderQty a.UnitPrice 1.00 UnitPriceDiscount* *( -a ))as from [Sales] [SalesOrderHeader] b right join [Sales] [SalesOrderDetail] a b on SalesOrderID=a.SalesOrderID left join [Sales] [Customer] c on c CustomerID=b CustomerID group by a.SalesOrderID, b.OrderDate , b.CustomerID, c AccountNumber order by tong_tien;
• Là một cấu trúc lưu lại trường dữ liệu đã được sắp xếp và một con trỏ từ mỗi bản ghi tương ứng trong bảng được đánh chỉ mục
CREATE INDEX index_name ON table_name (column_name) b Chi tiết:
❖ Trước khi đánh index select a.[SalesOrderID],b [CustomerID], c Name, b.OrderDate from [Sales] [SalesOrderDetail] a left join [Sales] [SalesOrderHeader] b on b [SalesOrderID]=a SalesOrderID left join [Production] [Product] c on c [ProductID]=a [ProductID] where [LineTotal] in (2024.99400 2039.994000 3034.994000 2064.99400, , , ) and DATEDIFF day( , b [OrderDate] b [ShipDate] 7 , )= and year(b OrderDate )in('2011' '2012', )
Tốc độ truy vấn: 5537ms
❖ Sau khi đánh index create index inn [Sales].[SalesOrderDetail](on LineTotal include (ProductID) ) create index ins [Production].[Product]([Name]) on create index inj [Sales].[SalesOrderHeader] ([SaleOrderID) include on
([OrderDate],[ShipDate]) select a.[SaleOrderID], b [CustomerID] c , Name, b OrderDate from [Sales] [SalesOrderDetail] a left join [Sales] [SalesOrderHeader] b on b [SalesOrderID]=a SalesOrderID left join [Production] [Product] c on c ProductID=a ProductID where [LineTotal] in (2024.99400 2039.994000 3034.9940000 2064.99400, , , ) and DATEDIFF day ( , b [OrderDate] b [ShipDate] 7 , )= and year (b OrderDate ) in('2011','2012')
Tốc độ truy vấn: 13 ms
Ta thấy : Thời gian thực hiện truy vấn giảm hơn 426 lần
- Table partitioning là kỹ thuật phân chia bảng thành từng đoạn nhằm quản lý hiệu quả cơ sở dữ liệu với dung lượng lớn, cung cấp 1 phương pháp khác để chia dữ liệu những bảng lớn và trỏ tới những vùng nhỏ hơn
- Bảng được phân đoạn dựa vào giá trị một trường của nó
- Các ưu điểm của Table partitioning:
+ Tiện lợi về quản trị :
Backup/restore một đoạn mà không ảnh hưởng đến các đoạn còn lại REBUILD lại index trên từng phân đoạn thay vì trên toàn bộ bảng
Cho phép nhanh chóng loại bỏ dữ liệu nguyên một đoạn ra khỏi bảng + Cải tiến về hiệu năng:
Lấy dữ liệu ở một đoạn nào đó chỉ cần truy nhập vào đoạn đó và bỏ qua các đoạn còn lại
Dữ liệu được lưu trữ ở các vùng vật lý khác nhau, giảm tranh chấp in/out giữa các câu lệnh
-Việc phân đoạn bảng dựa trên hai khái niệm mới sau đây :
Partition function: Qui định giá trị biên cho các đoạn Hệ thống dựa vào hàm này để xác định đoạn mà mỗi bản ghi thuộc vào
Partition scheme: Ánh xạ các đoạn khai báo trong partition function vào các filegroup (mỗi đoạn được lưu trữ tại một filegroup)
- Các bước phân đoạn Partition :
Đầu tiên tạo partition function để định nghĩa giá trị biên của các đoạn
Dải giá trị mà chúng em đã thực hiện định nghĩa giá trị biên của tổng gồm đoạn: tong 0)
ROLLBACK TRAN declare @a nvarchar (100) = error_mesage() declare @b int = error_severity() declare @c int = error_state() raiserror (@a, @b, @c) end catch
- Nhận xét kết quả thu được:
• Thông báo lỗi vì khi insert dữ liệu ta nhập sai kiểu dữ liệu của cột Rating là
• Vì vậy, ta thay ‘abc’ bằng một dữ liệu khác có kiểu dữ liệu int ví dụ ta thay
‘ abc’ bằng 5 sẽ thu được kết quả như sau