Database
 sql >> Base de données >  >> RDS >> Database

Une utilisation pratique de la fonction SQL COALESCE

Cet article parle de l'utilisation pratique de la fonction SQL COALESCE concernant certains scénarios de vie professionnelle. Il souligne l'importance d'une utilisation correcte et à temps de cette fonction pour résoudre les problèmes liés à la base de données.

De plus, nous mettrons en œuvre les étapes particulières nécessaires pour résoudre les problèmes à l'aide de cette fonction.

Prérequis

Avant de vous préparer à examiner et à mettre en œuvre les exemples à venir dans cet article, il est fortement recommandé de vous familiariser avec les problèmes suivants :

  • Principes de base de T-SQL . Les lecteurs doivent bien connaître les scripts T-SQL. De plus, ils doivent écrire et exécuter confortablement des requêtes SQL sur des exemples de bases de données.
  • Principes de base de la fonction COALESCE . Les lecteurs doivent être familiarisés avec ce domaine. Si vous avez besoin d'informations pour l'étudier, reportez-vous à l'article SQL COALESCE Function Handling NULL Values ​​Effectively .

Exemple de base de données

Configurer un exemple de base de données appelé CoalesceUseDB comme suit :

-- Setup sample database
Create DATABASE CoalesceUseDB;
GO

Vous pouvez également exécuter des requêtes sur tempdb base de données si vous préférez le faire.

Réflexions sur l'utilisation pratique

Nous allons passer en revue deux cas pratiques d'utilisation de la fonction COALESCE. Nous devons garder à l'esprit que l'objectif principal de cette fonction est de renvoyer la première valeur non nulle de la liste des entrées (paramètres) qui lui sont transmises – un paramètre peut également être une colonne.

L'une des approches de ces scénarios consiste à utiliser une structure de stockage (table), qui contient plusieurs colonnes. Une seule de ces colonnes doit être remplie pour fournir des informations significatives.

Passons maintenant aux utilisations pratiques.

Scénario d'abonnements d'hébergement Web

Ici, nous considérons un fournisseur de services d'hébergement Web dont les services (payants) sont utilisés par certains clients. Les clients peuvent choisir de payer mensuellement, trimestriellement ou annuellement, de l'une des manières suivantes.

Maintenant, nous supposons que les clients viennent de payer début octobre. Ainsi, nous visualisons une structure tabulaire du point de vue de la base de données comme suit :

Créer un tableau pour stocker les commandes

Nous devons créer une table pour stocker toutes les commandes passées par les clients via l'une des options de paiement disponibles par rapport à l'exemple de base de données :

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

Remplissez le tableau comme suit :

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

Vérification rapide

Jetez un coup d'œil au tableau en exécutant le script T-SQL suivant :

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

La sortie est :

Identifier le problème

Tout semble bon, mais il y a un problème.

Nous voulons examiner tous les paiements des clients, qu'ils aient effectué un paiement mensuel, annuel ou trimestriel. Il ne semble pas y avoir de moyen de regrouper tous ces paiements en évitant les valeurs NULL, surtout si vous travaillez sur un rapport contenant toutes les commandes des clients et ignorez s'ils ont payé mensuellement, annuellement ou trimestriellement.

Concevoir la solution

La solution consiste à utiliser la fonction COALESCE. Il réunira tous ces modes de paiement et exclura les valeurs NULL non essentielles.

Ceci peut être facilement réalisé comme suit :

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

La sortie est :

Utilisation de SQL View pour améliorer la solution

Nous pouvons améliorer cette solution en transformant le script en vue SQL et en le réutilisant pour l'analyse et la création de rapports :

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

Exécutez la vue comme suit :

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

Les résultats sont :

Astuce :vous pouvez créer un rapport SSRS en utilisant la vue SQL comme stratégie de récupération de données sous-jacente.

Scénario d'organisations auto-référencées

Il s'agit d'un scénario lié à la base de données de vie plus compliqué mais plus courant.

La façon la plus simple de le comprendre est de faire appel à la relation hiérarchique (parent-enfant). Ici, nous considérons un tableau avec tous les enregistrements des employés et les enregistrements de leurs managers. Cette table stocke également chaque responsable en tant qu'employé dans la même table.

Cependant, nous ne nous concentrerons pas entièrement sur la relation tabulaire employé-gestionnaire ici.

Considérons une hiérarchie parent-enfant où chaque organisation appartient à une organisation maîtresse. L'organisation principale elle-même est stockée en tant qu'organisation dans la même structure pour créer une relation d'auto-référence.

La meilleure façon de comprendre cela est de construire la structure et de la voir vous-même.

Créer une table pour stocker les organisations principales et les sous-organisations

Créez et remplissez une table SQL dans l'exemple de base de données pour stocker le maître et ses sous-organisations comme suit :

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

Vérification et analyse rapides

Nous pouvons afficher la table nouvellement créée en exécutant la requête suivante :

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

Ensuite, nous obtenons le résultat suivant :

Ainsi, nous pouvons en déduire que les organisations principales suivantes sont stockées dans la table :

  1. CodingSight
  2. CodingSight 2

Si vous regardez la colonne MasterId, vous pouvez voir que les organisations principales ont NULL MasterId. C'est parce qu'ils sont des organisations maîtresses.

Les organisations suivantes relèvent de l'organisation principale CodingSight. Ils ont le MasterId pointant vers le CodingSight organisme :

  1. Blog SQL
  2. Blog SSRS

Il en va de même pour les sous-organisations suivantes sous CodingSight 2 Organisation maître :

  1. Blog SSAS
  2. Blog SSIS

Énoncé du problème

Supposons que nous ayons besoin de développer un rapport de tous les articles publiés par ces organisations, y compris leurs sous-organisations, mais représentées par l'organisation principale.

En termes simples, nous devons créer un rapport pour afficher tous les articles publiés par une organisation principale, y compris les articles publiés par ses sous-organisations, mais nous ne pouvons pas mentionner les sous-organisations.

Concevoir la solution

La fonction COALESCE peut être très pratique ici car nous devons rencontrer des valeurs NULL pour l'organisation principale, mais mettre le maître et la sous-organisation dans la fonction n'aidera pas.

Par exemple, nous essayons de résumer les articles en enveloppant leurs identifiants dans la fonction comme suit :

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

La sortie est :

Améliorons maintenant la sortie en utilisant la fonction souhaitée comme suit :

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

La sortie est :

Nous avons réussi à fusionner les identifiants maître et sous-organisation pour obtenir le nombre total d'articles publiés par ces organisations.

Le script doit être plus compliqué pour obtenir les résultats souhaités car nous devons filtrer les sous-organisations sans perdre le nombre de leurs articles. Ce décompte doit être attribué à leurs organisations principales.

Écrivez le script T-SQL suivant pour y parvenir :

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

La sortie est :

Toutes nos félicitations! Nous avons appris avec succès l'utilisation pratique de la fonction COALESCE concernant certains scénarios intéressants en temps réel.

Choses à faire

Maintenant que vous pouvez gérer efficacement les valeurs NULL et résoudre des problèmes complexes avec des valeurs NULL, vous devez être remplacé selon les besoins de l'entreprise. Essayons les choses suivantes pour améliorer encore vos compétences :

  1. Essayez de créer et d'exécuter une vue SQL pour le scénario d'organisation auto-référencé :
  2. Reportez-vous au Développement des rapports SSRS en termes simples article et créez un rapport pour le scénario d'hébergement Web.
  3. Ajouter plus de données au WebOrder table en fournissant différents OrderDate valeurs mentionnées dans le scénario des services d'hébergement Web. Ensuite, transformez la vue SQL en une procédure stockée qui accepte la OrderDate paramètre.
  4. Reportez-vous à Création d'un rapport SSRS professionnel basé sur une procédure stockée article et créez un rapport basé sur la date de commande pour le scénario modifié décrit au point précédent.

Lire aussi

Principales réponses aux 5 questions brûlantes sur la fonction SQL COALESCE

Gérer efficacement les valeurs NULL avec la fonction SQL COALESCE pour les débutants