Bài viết này nói về cách sử dụng thực tế của hàm SQL COALESCE liên quan đến một số tình huống cuộc sống nghề nghiệp. Nó nêu bật tầm quan trọng của việc sử dụng đúng và kịp thời chức năng này để giải quyết các vấn đề liên quan đến cơ sở dữ liệu.
Ngoài ra, chúng tôi sẽ thực hiện các bước cụ thể cần thiết để giải quyết vấn đề với sự trợ giúp của chức năng này.
Điều kiện tiên quyết
Trước khi chuẩn bị xem xét và triển khai các ví dụ sắp tới trong bài viết này, bạn nên làm quen với các vấn đề sau:
- Kiến thức Cơ bản về T-SQL . Người đọc nên biết rõ về kịch bản T-SQL. Ngoài ra, họ cần viết và chạy các truy vấn SQL dựa trên cơ sở dữ liệu mẫu một cách thoải mái.
- Khái niệm cơ bản về hàm COALESCE . Người đọc cần phải làm quen với lĩnh vực này. Nếu bạn cần thông tin để nghiên cứu nó, hãy tham khảo bài viết Hàm SQL COALESCE Xử lý giá trị NULL một cách hiệu quả .
Cơ sở dữ liệu mẫu
Thiết lập cơ sở dữ liệu mẫu có tên CoalesceUseDB như sau:
-- Setup sample database
Create DATABASE CoalesceUseDB;
GO
Ngoài ra, bạn có thể chạy các truy vấn đối với tempdb cơ sở dữ liệu nếu bạn muốn làm như vậy.
Suy nghĩ về việc sử dụng thực tế
Chúng ta sẽ xem xét hai trường hợp sử dụng thực tế của hàm COALESCE. Chúng ta nên nhớ rằng mục tiêu chính của hàm này là trả về giá trị Non-Null đầu tiên từ danh sách các đầu vào (tham số) được chuyển cho nó - aparameter cũng có thể là một cột.
Một trong những cách tiếp cận với các tình huống như vậy là sử dụng cấu trúc lưu trữ (bảng), chứa nhiều cột. Chỉ một trong các cột đó cần được điền để tạo ra thông tin có ý nghĩa.
Bây giờ chúng ta hãy đi qua các ứng dụng thực tế.
Kịch bản đăng ký lưu trữ web
Ở đây, chúng tôi xem xét một nhà cung cấp dịch vụ lưu trữ web có dịch vụ (trả phí) được một số khách hàng sử dụng. Khách hàng có thể chọn thanh toán hàng tháng, hàng quý hoặc hàng năm - theo bất kỳ cách nào trong số những cách này.
Bây giờ, chúng tôi giả sử rằng khách hàng vừa thanh toán vào đầu tháng 10. Do đó, chúng tôi hình dung cấu trúc dạng bảng từ quan điểm cơ sở dữ liệu như sau:
Tạo một Bảng để lưu trữ các đơn đặt hàng
Chúng tôi cần xây dựng một bảng để lưu trữ tất cả các đơn đặt hàng của khách hàng thông qua bất kỳ tùy chọn thanh toán nào có sẵn dựa trên cơ sở dữ liệu mẫu:
Use CoalesceUseDB
-- Create WebOrder table
CREATE TABLE [dbo].[WebOrder]
(
[Id] INT NOT NULL,
[Customer] VARCHAR(40) NOT NULL,
[YearlyPayment] DECIMAL(10,2) NULL,
[QuarterlyPayment] DECIMAL(10,2) NULL,
[MonthlyPayment] DECIMAL(10,2) NULL,
[OrderDate] DATETIME2 NOT NULL,
CONSTRAINT [PK_WebOrder] PRIMARY KEY (Id)
)
Điền vào bảng như sau:
-- Populate WebOrder table
INSERT INTO [dbo].[WebOrder] ([Id], [Customer], [YearlyPayment], [QuarterlyPayment], [MonthlyPayment], [OrderDate]) VALUES (1, N'Asif', CAST(70.00 AS Decimal(10, 2)), NULL, NULL, N'2020-10-01 00:00:00')
INSERT INTO [dbo].[WebOrder] ([Id], [Customer], [YearlyPayment], [QuarterlyPayment], [MonthlyPayment], [OrderDate]) VALUES (2, N'Peter', NULL, CAST(35.00 AS Decimal(10, 2)), NULL, N'2020-10-01 00:00:00')
INSERT INTO [dbo].[WebOrder] ([Id], [Customer], [YearlyPayment], [QuarterlyPayment], [MonthlyPayment], [OrderDate]) VALUES (3, N'Sarah', NULL, NULL, CAST(6.00 AS Decimal(10, 2)), N'2020-10-01 00:00:00')
Kiểm tra nhanh
Hãy xem nhanh bảng bằng cách chạy tập lệnh T-SQL sau:
-- View WebOrder table
SELECT wo.Id,wo.Customer,wo.YearlyPayment,wo.QuarterlyPayment,wo.MonthlyPayment,wo.OrderDate
FROM dbo.WebOrder wo
Đầu ra là:
Xác định vấn đề
Tất cả đều có vẻ ổn, nhưng có một vấn đề.
Chúng tôi muốn xem xét tất cả các khoản thanh toán của khách hàng, bất kể họ thanh toán hàng tháng, hàng năm hay hàng quý. Dường như không có cách nào để kết hợp tất cả các khoản thanh toán này với nhau bằng cách tránh NULL, đặc biệt nếu bạn làm việc trên một báo cáo chứa tất cả các đơn đặt hàng của khách hàng và bỏ qua việc họ đã thanh toán hàng tháng, hàng năm hay hàng quý.
Thiết kế giải pháp
Giải pháp là sử dụng chức năng COALESCE. Nó sẽ kết hợp tất cả các phương thức thanh toán này với nhau và loại trừ các giá trị NULL không cần thiết.
Điều này có thể dễ dàng đạt được như sau:
--View all the web orders regardless of the payment mode
SELECT wo.Id,wo.Customer,COALESCE(wo.YearlyPayment,wo.QuarterlyPayment,wo.MonthlyPayment) AS Payment,wo.OrderDate
FROM dbo.WebOrder wo
Đầu ra là:
Sử dụng SQL View để cải thiện giải pháp
Chúng tôi có thể cải thiện giải pháp này bằng cách chuyển tập lệnh thành dạng xem SQL và sử dụng lại nó để phân tích và báo cáo:
-- Create AllWebOrders view
CREATE VIEW
AllWebOrders
AS
SELECT wo.Id,wo.Customer,COALESCE(wo.YearlyPayment,wo.QuarterlyPayment,wo.MonthlyPayment) AS Payment,FORMAT(wo.OrderDate,'dd-MMM-yyyy') AS OrderDate
FROM dbo.WebOrder wo
Chạy chế độ xem như sau:
--Run SQL View to see all the web orders
SELECT awo.Id,awo.Customer,awo.Payment,awo.OrderDate
FROM dbo.AllWebOrders awo
Kết quả là:
Gợi ý:bạn có thể tạo báo cáo SSRS bằng cách sử dụng chế độ xem SQL làm chiến lược truy xuất dữ liệu cơ bản.
Kịch bản về các tổ chức tự tham khảo
Đây là một tình huống phức tạp hơn nhưng phổ biến hơn liên quan đến cơ sở dữ liệu cuộc sống.
Cách hiểu đơn giản nhất đó là mối quan hệ thứ bậc (cha-con). Ở đây, chúng tôi xem xét một bảng có tất cả hồ sơ của nhân viên và hồ sơ của người quản lý của họ. Bảng này cũng lưu trữ mỗi người quản lý như một nhân viên trong cùng một bảng.
Tuy nhiên, chúng tôi sẽ không tập trung hoàn toàn vào mối quan hệ bảng giữa nhân viên và người quản lý ở đây.
Chúng ta hãy xem xét hệ thống phân cấp cha-con trong đó mỗi tổ chức thuộc về một tổ chức chính. Bản thân tổ chức chính được lưu trữ như một tổ chức trong cùng một cấu trúc để tạo ra mối quan hệ tự tham chiếu.
Cách tốt nhất để hiểu điều này là tự xây dựng cấu trúc và xem nó.
Tạo bảng để lưu trữ tổ chức chính và tổ chức con
Tạo và điền một bảng SQL vào cơ sở dữ liệu mẫu để lưu trữ cái chính và các tổ chức con của nó như sau:
-- Creating master sub organisation table (self-referencing table)
CREATE TABLE [dbo].[Organisation]
(
[Id] INT NOT NULL ,
[Name] VARCHAR(40) NULL,
[Articles] INT NULL,
[MasterId] INT NULL,
CONSTRAINT [PK_Organisation] PRIMARY KEY ([Id])
);
GO
-- Inserting data into the Organisation table
-- Populate Organisation table
INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles], [MasterId]) VALUES (1,'CodingSight',10, NULL)
INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles],[MasterId]) VALUES (2, 'SQL Blog', 2,1)
INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles],[MasterId]) VALUES (3, 'SSRS Blog', 3,1)
INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles],[MasterId]) VALUES (4,'CodingSight 2',5, NULL)
INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles],[MasterId]) VALUES (5, 'SSAS Blog', 1,4)
INSERT INTO [dbo].[Organisation] ([Id], [Name], [Articles],[MasterId]) VALUES (6,'SSIS Blog', 2,4)
Kiểm tra và phân tích nhanh
Chúng ta có thể xem bảng mới tạo bằng cách chạy truy vấn sau:
-- View Organisation table
SELECT o.Id,o.Name,o.MasterId
FROM dbo.Organisation o
Sau đó, chúng tôi nhận được kết quả sau:
Do đó, chúng ta có thể suy ra rằng các tổ chức chính sau đây được lưu trữ trong bảng:
- CodingSight
- CodingSight 2
Nếu bạn nhìn vào cột MasterId, bạn có thể thấy rằng các tổ chức chính có NULL MasterId. Đó là bởi vì họ là tổ chức chính.
Các tổ chức sau đây thuộc tổ chức chính CodingSight. Họ có MasterId trỏ đến CodingSight tổ chức:
- Blog SQL
- Blog SSRS
Điều này cũng đúng với các tổ chức con sau trong CodingSight 2 Tổ chức chính:
- Blog SSAS
- Blog SSIS
Tuyên bố vấn đề
Giả sử chúng ta cần phát triển một báo cáo về tất cả các bài báo được xuất bản bởi các tổ chức này, bao gồm cả các tổ chức con của họ, nhưng được đại diện bởi tổ chức chính.
Nói một cách đơn giản, chúng tôi cần xây dựng một báo cáo để hiển thị tất cả các bài báo được xuất bản bởi một tổ chức chính, bao gồm cả những bài báo do các tổ chức con của tổ chức đó xuất bản, nhưng chúng tôi không thể đề cập đến các tổ chức con đó.
Thiết kế giải pháp
Ở đây, hàm COALESCE có thể rất hữu ích vì chúng ta phải gặp NULL cho tổ chức chính, nhưng việc đưa tổ chức chính và tổ chức con vào trong hàm sẽ không hữu ích.
Ví dụ:chúng tôi cố gắng tổng hợp các bài viết bằng cách gói id của chúng vào hàm như sau:
-- Getting total articles for each of the master and sub-organization without using COALESCE
SELECT O.Id,O.MasterId,SUM(O.Articles) as Total_Articles FROM dbo.Organisation O
GROUP BY O.MasterId,O.Id
Đầu ra là:
Bây giờ, chúng ta hãy cải thiện kết quả đầu ra bằng cách sử dụng chức năng mong muốn như sau:
-- Getting total articles for each of the master and sub organizations using COALESCE
SELECT COALESCE(O.Id,O.MasterId) MasterOrSubId,O.Name,SUM(O.Articles) as Total_Articles FROM dbo.Organisation O
GROUP BY COALESCE(O.Id,O.MasterId),O.Name
Đầu ra là:
Chúng tôi đã hợp nhất thành công Id tổ chức chính và tổ chức con để có được tổng số bài báo được xuất bản bởi các tổ chức này.
Tập lệnh phải phức tạp hơn để có được kết quả mong muốn vì chúng ta cần lọc các tổ chức con ra ngoài mà không làm mất số lượng bài báo của họ. Số lượng đó phải được chỉ định cho các tổ chức chính của họ.
Viết tập lệnh T-SQL sau để đạt được điều này:
-- Sum of all the articles published by the master organizations and their sub-organizations represented by the master organizations
SELECT a.OrgId,o2.Name,a.Total_Articles FROM
(SELECT COALESCE(O.MasterId,O.Id) AS OrgId,SUM(Articles) as Total_Articles FROM dbo.Organisation o
WHERE COALESCE(O.MasterId,O.Id) IN
(SELECT Id FROM dbo.Organisation where MasterId IS NULL)
GROUP BY COALESCE(O.MasterId,O.Id)) as a
INNER JOIN dbo.Organisation o2
on o2.Id=a.OrgId
Đầu ra là:
Xin chúc mừng! Chúng tôi đã học thành công cách sử dụng thực tế của hàm COALESCE liên quan đến một số tình huống thời gian thực thú vị.
Việc cần làm
Bây giờ bạn có thể xử lý giá trị NULL một cách hiệu quả và giải quyết các vấn đề phức tạp với giá trị NULL, bạn cần phải được thay thế theo yêu cầu kinh doanh. Hãy thử những điều sau để cải thiện kỹ năng của bạn hơn nữa:
- Cố gắng tạo và chạy dạng xem SQL cho tình huống tổ chức tự tham chiếu:
- Tham khảo Phát triển báo cáo SSRS bằng các thuật ngữ đơn giản và tạo báo cáo cho tình huống lưu trữ web.
- Thêm nhiều dữ liệu hơn vào WebOrder bảng bằng cách cung cấp Ngày đặt hàng khác nhau các giá trị được đề cập trong kịch bản dịch vụ lưu trữ web. Sau đó, chuyển dạng xem SQL thành một thủ tục được lưu trữ chấp nhận Ngày đặt hàng tham số.
- Tham khảo Tạo Báo cáo SSRS Chuyên nghiệp dựa trên Quy trình Đã Lưu trữ và xây dựng báo cáo dựa trên ngày đặt hàng cho kịch bản sửa đổi đã thảo luận ở điểm trước.
Đọc thêm
Các câu trả lời hàng đầu cho 5 câu hỏi nhức nhối về Hàm COALESCE trong SQL
Xử lý các giá trị NULL một cách hiệu quả với Hàm COALESCE trong SQL cho người mới bắt đầu