Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Penggunaan Praktis dari Fungsi SQL COALESCE

Artikel ini berbicara tentang penggunaan praktis dari fungsi SQL COALESCE mengenai beberapa skenario kehidupan profesional. Ini menyoroti pentingnya penggunaan yang benar dan tepat waktu dari fungsi ini untuk mengatasi masalah terkait database.

Selain itu, kami akan menerapkan langkah-langkah khusus yang diperlukan untuk memecahkan masalah dengan bantuan fungsi ini.

Prasyarat

Sebelum Anda bersiap untuk meninjau dan menerapkan contoh yang akan datang dalam artikel ini, sangat disarankan untuk memahami masalah berikut:

  • Dasar-Dasar T-SQL . Pembaca harus menyadari skrip T-SQL. Selain itu, mereka perlu menulis dan menjalankan kueri SQL terhadap database sampel dengan nyaman.
  • Dasar-dasar fungsi COALESCE . Pembaca harus terbiasa dengan bidang ini. Jika Anda memerlukan informasi untuk mempelajarinya, lihat artikel Fungsi SQL COALESCE Menangani Nilai NULL Secara Efektif .

Contoh Basis Data

Siapkan database sampel yang disebut CoalesceUseDB sebagai berikut:

-- Setup sample database
Create DATABASE CoalesceUseDB;
GO

Atau, Anda dapat menjalankan kueri terhadap tempdb database jika Anda ingin melakukannya.

Pemikiran tentang Penggunaan Praktis

Kami akan meninjau dua kasus penggunaan praktis fungsi COALESCE. Kita harus ingat bahwa tujuan utama dari fungsi ini adalah untuk mengembalikan nilai Non-Null pertama dari daftar input (parameter) yang diteruskan ke sana – parameter bisa berupa kolom juga.

Salah satu pendekatan untuk skenario tersebut adalah menggunakan struktur penyimpanan (tabel), yang berisi beberapa kolom. Hanya satu dari kolom tersebut yang perlu diisi untuk membuat informasi yang berarti.

Sekarang mari kita lihat kegunaan praktisnya.

Skenario Langganan Hosting Web

Di sini, kami mempertimbangkan penyedia layanan hosting web yang layanannya (berbayar) digunakan oleh beberapa pelanggan. Pelanggan dapat memilih untuk membayar bulanan, triwulanan, atau tahunan – dengan salah satu cara berikut.

Sekarang, kita misalkan pelanggan baru membayar di awal Oktober. Jadi, kami memvisualisasikan struktur tabel dari sudut pandang database sebagai berikut:

Membuat Tabel untuk menyimpan pesanan

Kita perlu membuat tabel untuk menyimpan semua pesanan yang dibuat oleh pelanggan melalui salah satu opsi pembayaran yang tersedia terhadap database sampel:

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) 
)

Isi tabel sebagai berikut:

-- 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')

Pemeriksaan cepat

Lihat tabel dengan cepat dengan menjalankan skrip T-SQL berikut:

-- View WebOrder table
SELECT wo.Id,wo.Customer,wo.YearlyPayment,wo.QuarterlyPayment,wo.MonthlyPayment,wo.OrderDate 
FROM dbo.WebOrder wo

Outputnya adalah:

Identifikasi Masalah

Semua terlihat bagus, tapi ada masalah.

Kami ingin melihat semua pembayaran pelanggan, terlepas dari apakah mereka melakukan pembayaran bulanan, tahunan, atau triwulanan. Tampaknya tidak ada cara untuk menggabungkan semua pembayaran ini bersama-sama dengan menghindari NULL, terutama jika Anda mengerjakan laporan yang berisi semua pesanan pelanggan dan mengabaikan apakah mereka membayar bulanan, tahunan, atau triwulanan.

Desain Solusinya

Solusinya adalah dengan menggunakan fungsi COALESCE. Ini akan menggabungkan semua mode pembayaran ini bersama-sama dan mengecualikan nilai NULL yang tidak penting.

Ini dapat dengan mudah dicapai sebagai berikut:

--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

Outputnya adalah:

Menggunakan Tampilan SQL untuk Meningkatkan Solusi

Kami dapat meningkatkan solusi ini dengan mengubah skrip menjadi tampilan SQL dan menggunakannya kembali untuk analisis dan pelaporan:

-- 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

Jalankan tampilan sebagai berikut:

--Run SQL View to see all the web orders
SELECT awo.Id,awo.Customer,awo.Payment,awo.OrderDate
FROM dbo.AllWebOrders awo

Hasilnya adalah:

Petunjuk:Anda dapat membuat laporan SSRS menggunakan tampilan SQL sebagai strategi pengambilan data yang mendasari.

Skenario Organisasi yang Merujuk Sendiri

Ini adalah skenario terkait database kehidupan yang lebih rumit tetapi lebih umum.

Cara paling sederhana untuk memahaminya adalah dengan menarik hubungan hierarkis (orang tua-anak). Di sini, kami mempertimbangkan tabel dengan semua catatan karyawan dan catatan manajer mereka. Tabel ini juga menyimpan setiap manajer sebagai karyawan di meja yang sama.

Namun, kami tidak akan fokus sepenuhnya pada hubungan tabular karyawan-manajer di sini.

Mari kita pertimbangkan hierarki induk-anak di mana setiap organisasi termasuk dalam organisasi induk. Organisasi induk itu sendiri disimpan sebagai organisasi dalam struktur yang sama untuk menciptakan hubungan referensi diri.

Cara terbaik untuk memahami ini adalah dengan membangun struktur dan melihatnya sendiri.

Membuat Tabel untuk Menyimpan Master dan Sub-organisasi

Buat dan isi tabel SQL dalam database sampel untuk menyimpan master dan sub-organisasinya sebagai berikut:

-- 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)

Pemeriksaan dan Analisis Cepat

Kita dapat melihat tabel yang baru dibuat dengan menjalankan query berikut:

-- View Organisation table
SELECT o.Id,o.Name,o.MasterId
FROM dbo.Organisation o

Kemudian, kita mendapatkan hasil sebagai berikut:

Dengan demikian, kita dapat menyimpulkan bahwa organisasi master berikut disimpan dalam tabel:

  1. CodingSight
  2. CodingSight 2

Jika Anda melihat kolom MasterId, Anda dapat melihat bahwa organisasi master memiliki NULL MasterId. Itu karena mereka adalah organisasi induk.

Organisasi berikut berada di bawah organisasi master CodingSight. Mereka memiliki MasterId yang menunjuk ke CodingSight organisasi:

  1. Blog SQL
  2. Blog SSRS

Hal yang sama berlaku untuk sub-organisasi berikut di bawah CodingSight 2 Organisasi induk:

  1. Blog SSAS
  2. Blog SSIS

Pernyataan Masalah

Misalkan kita perlu mengembangkan laporan semua artikel yang diterbitkan oleh organisasi-organisasi ini, termasuk sub-organisasi mereka, tetapi diwakili oleh organisasi induk.

Dengan kata sederhana, kita perlu membuat laporan untuk menampilkan semua artikel yang diterbitkan oleh organisasi induk, termasuk artikel yang diterbitkan oleh suborganisasinya, tetapi kita tidak dapat menyebutkan suborganisasinya.

Desain Solusinya

Fungsi COALESCE bisa sangat berguna di sini karena kita harus menemukan NULL untuk organisasi master, tetapi menempatkan master dan sub-organisasi dalam fungsi tidak akan membantu.

Misalnya, kita mencoba meringkas artikel dengan membungkus id-nya ke dalam fungsi sebagai berikut:

-- 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

Outputnya adalah:

Sekarang, mari kita tingkatkan output dengan menggunakan fungsi yang diinginkan sebagai berikut:

-- 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

Outputnya adalah:

Kami telah berhasil menggabungkan ID master dan sub-organisasi untuk mendapatkan jumlah total artikel yang diterbitkan oleh organisasi-organisasi ini.

Skrip harus lebih rumit untuk mendapatkan hasil yang diinginkan karena kami perlu menyaring sub-organisasi tanpa kehilangan jumlah artikel mereka. Jumlah itu harus ditetapkan ke organisasi induk mereka.

Tulis skrip T-SQL berikut untuk mencapai ini:

-- 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

Outputnya adalah:

Selamat! Kami telah berhasil mempelajari penggunaan praktis dari fungsi COALESCE mengenai beberapa skenario waktu nyata yang menarik.

Hal yang harus dilakukan

Sekarang Anda dapat menangani nilai NULL secara efektif dan memecahkan masalah kompleks dengan nilai NULL, Anda perlu diganti sesuai kebutuhan bisnis. Mari kita coba hal-hal berikut untuk meningkatkan keterampilan Anda lebih lanjut:

  1. Coba buat dan jalankan tampilan SQL untuk skenario organisasi referensi mandiri:
  2. Lihat Pengembangan Laporan SSRS dalam Istilah Sederhana artikel dan buat laporan untuk skenario hosting web.
  3. Tambahkan lebih banyak data ke WebOrder tabel dengan menyediakan OrderDate different yang berbeda nilai yang disebutkan dalam skenario layanan hosting web. Kemudian, ubah tampilan SQL menjadi prosedur tersimpan yang menerima OrderDate parameter.
  4. Lihat Membuat Laporan SSRS Profesional berdasarkan Prosedur Tersimpan artikel dan buat laporan berbasis tanggal pemesanan untuk skenario yang dimodifikasi yang dibahas di poin sebelumnya.

Baca Juga

Jawaban Teratas untuk 5 Pertanyaan Pembakaran pada Fungsi SQL COALESCE

Menangani Nilai NULL Secara Efektif dengan Fungsi SQL COALESCE untuk Pemula


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menerapkan pengurutan khusus

  2. Server Tertaut Salesforce.com dan sp_columns_ex

  3. Skema Kepingan Salju

  4. Penyembunyian Data dalam Aplikasi DB

  5. Menguji Pernyataan DML untuk OLTP Dalam Memori