Database
 sql >> Database >  >> RDS >> Database

Un uso pratico della funzione SQL COALESCE

Questo articolo parla dell'uso pratico della funzione SQL COALESCE per quanto riguarda alcuni scenari di vita professionale. Sottolinea l'importanza di un uso corretto e tempestivo di questa funzione per affrontare i problemi relativi al database.

Inoltre, implementeremo i passaggi particolari necessari per risolvere i problemi con l'aiuto di questa funzione.

Prerequisiti

Prima di prepararti a rivedere e implementare gli esempi imminenti in questo articolo, ti consigliamo vivamente di acquisire familiarità con i seguenti problemi:

  • Nozioni di base su T-SQL . I lettori dovrebbero essere ben consapevoli degli script T-SQL. Inoltre, devono scrivere ed eseguire comodamente query SQL su database di esempio.
  • Nozioni di base sulla funzione COALESCE . I lettori devono avere familiarità con questo campo. Se hai bisogno delle informazioni per studiarlo, fai riferimento all'articolo Funzione SQL COALESCE che gestisce efficacemente i valori NULL .

Banca dati campione

Imposta un database di esempio chiamato CoalesceUseDB come segue:

-- Setup sample database
Create DATABASE CoalesceUseDB;
GO

In alternativa, puoi eseguire query su tempdb database se preferisci farlo.

Riflessioni sull'uso pratico

Esamineremo due casi d'uso pratici della funzione COALESCE. Dobbiamo tenere presente che l'obiettivo principale di questa funzione è restituire il primo valore Non Null dall'elenco degli input (parametri) che le vengono passati – anche un parametro potrebbe essere una colonna.

Uno degli approcci a tali scenari è l'utilizzo di una struttura di archiviazione (tabella), che contiene più colonne. Solo una di queste colonne deve essere compilata per creare informazioni significative.

Esaminiamo ora gli usi pratici.

Scenario abbonamenti Web Hosting

Qui, consideriamo un fornitore di servizi di hosting web i cui servizi (a pagamento) sono utilizzati da alcuni clienti. I clienti possono scegliere di pagare mensilmente, trimestralmente o annualmente, in uno qualsiasi di questi modi.

Ora, supponiamo che i clienti abbiano appena pagato all'inizio di ottobre. Pertanto, visualizziamo una struttura tabellare dal punto di vista del database come segue:

Costruisci un tavolo per archiviare gli ordini

Dobbiamo creare una tabella per memorizzare tutti gli ordini effettuati dai clienti tramite una delle opzioni di pagamento disponibili rispetto al database di esempio:

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

Compila la tabella come segue:

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

Verifica rapida

Dai una rapida occhiata alla tabella eseguendo il seguente script T-SQL:

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

L'output è:

Identifica il problema

Tutto sembra a posto, ma c'è un problema.

Vogliamo esaminare tutti i pagamenti dei clienti, indipendentemente dal fatto che abbiano effettuato un pagamento mensile, annuale o trimestrale. Non sembra esserci un modo per unire tutti questi pagamenti evitando i NULL, soprattutto se lavori su un report contenente tutti gli ordini dei clienti e ignori se hanno pagato mensilmente, annualmente o trimestralmente.

Progetta la soluzione

La soluzione è utilizzare la funzione COALESCE. Unirà tutte queste modalità di pagamento ed escluderà i valori NULL non essenziali.

Questo può essere facilmente ottenuto come segue:

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

L'output è:

Utilizzo di SQL View per migliorare la soluzione

Possiamo migliorare questa soluzione trasformando lo script in una vista SQL e riutilizzandolo per l'analisi e il reporting:

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

Eseguire la visualizzazione come segue:

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

I risultati sono:

Suggerimento:puoi creare un rapporto SSRS utilizzando la vista SQL come strategia di recupero dei dati sottostante.

Scenario delle organizzazioni autoreferenziali

Questo è uno scenario relativo al database di vita più complicato ma più comune.

Il modo più semplice per capirlo è fare appello alla relazione gerarchica (genitore-figlio). Qui, consideriamo una tabella con tutti i record dei dipendenti e dei loro manager. Questa tabella memorizza anche ogni manager come dipendente allo stesso tavolo.

Tuttavia, qui non ci concentreremo interamente sulla relazione tabulare dipendente-direttore.

Consideriamo una gerarchia genitore-figlio in cui ogni organizzazione appartiene a una principale. L'organizzazione principale stessa viene archiviata come organizzazione nella stessa struttura per creare una relazione autoreferenziale.

Il modo migliore per capirlo è costruire la struttura e vederla di persona.

Costruisci un tavolo per memorizzare le organizzazioni principali e secondarie

Creare e popolare una tabella SQL nel database di esempio per archiviare il master e le sue sottoorganizzazioni come segue:

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

Controllo rapido e analisi

Possiamo visualizzare la tabella appena creata eseguendo la seguente query:

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

Quindi, otteniamo il seguente risultato:

Pertanto, possiamo dedurre che le seguenti organizzazioni principali sono memorizzate nella tabella:

  1. CodingSight
  2. CodingSight 2

Se guardi la colonna MasterId, puoi vedere che le organizzazioni master hanno NULL MasterId. È perché sono organizzazioni principali.

Le seguenti organizzazioni sono sotto l'organizzazione master CodingSight. Hanno il MasterId che punta a CodingSight organizzazione:

  1. Blog SQL
  2. Blog SSRS

Lo stesso vale per le seguenti organizzazioni secondarie in CodingSight 2 Organizzazione principale:

  1. Blog SSAS
  2. Blog SSIS

Dichiarazione del problema

Supponiamo di dover sviluppare un rapporto di tutti gli articoli pubblicati da queste organizzazioni, comprese le loro sotto-organizzazioni, ma rappresentate dall'organizzazione principale.

In parole semplici, dobbiamo costruire un rapporto per mostrare tutti gli articoli pubblicati da un'organizzazione principale, inclusi gli articoli pubblicati dalle sue sotto-organizzazioni, ma non possiamo citare le sotto-organizzazioni.

Progetta la soluzione

La funzione COALESCE può essere molto utile qui poiché dobbiamo incontrare NULL per l'organizzazione principale, ma inserire master e sotto-organizzazione nella funzione non aiuta.

Ad esempio, proviamo a riassumere gli articoli racchiudendo i loro ID nella funzione come segue:

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

L'output è:

Ora, miglioriamo l'output utilizzando la funzione desiderata come segue:

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

L'output è:

Abbiamo unito con successo gli ID master e sub-organizzazione per ottenere il numero totale di articoli pubblicati da queste organizzazioni.

Lo script deve essere più complicato per ottenere i risultati desiderati poiché dobbiamo filtrare le sotto-organizzazioni senza perdere il conteggio dei loro articoli. Quel conteggio dovrebbe essere assegnato alle loro organizzazioni principali.

Scrivi il seguente script T-SQL per ottenere ciò:

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

L'output è:

Congratulazioni! Abbiamo appreso con successo l'uso pratico della funzione COALESCE in relazione ad alcuni interessanti scenari in tempo reale.

Cose da fare

Ora che puoi gestire i valori NULL in modo efficace e risolvere problemi complessi con valori NULL, devi essere sostituito secondo i requisiti aziendali. Proviamo le seguenti cose per migliorare ulteriormente le tue abilità:

  1. Prova a creare ed eseguire una vista SQL per lo scenario dell'organizzazione autoreferenziale:
  2. Fai riferimento a Sviluppo di rapporti SSRS in termini semplici articolo e creare un report per lo scenario di hosting web.
  3. Aggiungi più dati a WebOrder tabella fornendo diversi OrderDate valori menzionati nello scenario dei servizi di web hosting. Quindi, trasforma la visualizzazione SQL in una stored procedure che accetta OrderDate parametro.
  4. Fare riferimento a Creazione di un report SSRS professionale basato su stored procedure articolo e creare un rapporto basato sulla data dell'ordine per lo scenario modificato discusso nel punto precedente.

Leggi anche

Le migliori risposte a 5 domande scottanti sulla funzione SQL COALESCE

Gestire efficacemente i valori NULL con la funzione SQL COALESCE per principianti