sql >> Database >  >> RDS >> Database

Een praktisch gebruik van de SQL COALESCE-functie

Dit artikel gaat over het praktische gebruik van de SQL COALESCE-functie met betrekking tot enkele professionele levensscenario's. Het benadrukt het belang van correct en tijdig gebruik van deze functie om de databasegerelateerde problemen aan te pakken.

Daarnaast zullen we de specifieke stappen implementeren die nodig zijn om de problemen op te lossen met behulp van deze functie.

Vereisten

Voordat u zich voorbereidt om de komende voorbeelden in dit artikel door te nemen en te implementeren, is het ten zeerste aanbevolen om vertrouwd te raken met de volgende problemen:

  • T-SQL-basisprincipes . Lezers moeten goed op de hoogte zijn van T-SQL-scripting. Ze moeten ook comfortabel SQL-query's schrijven en uitvoeren op voorbeelddatabases.
  • Basisprincipes van de COALESCE-functie . Lezers moeten bekend zijn met dit gebied. Als je de informatie nodig hebt om het te bestuderen, raadpleeg dan het artikel SQL COALESCE-functie effectief omgaan met NULL-waarden .

Voorbeelddatabase

Stel een voorbeelddatabase in met de naam CoalesceUseDB als volgt:

-- Setup sample database
Create DATABASE CoalesceUseDB;
GO

Als alternatief kunt u query's uitvoeren op de tempdb database als u dat liever doet.

Gedachten over praktisch gebruik

We gaan twee praktische use-cases van de COALESCE-functie bekijken. We moeten in gedachten houden dat het hoofddoel van deze functie is om de eerste niet-null-waarde te retourneren uit de lijst met invoer (parameters) die eraan wordt doorgegeven – een parameter kan ook een kolom zijn.

Een van de benaderingen van dergelijke scenario's is het gebruik van een opslagstructuur (tabel), die meerdere kolommen bevat. Slechts één van die kolommen hoeft te worden ingevuld om zinvolle informatie te maken.

Laten we nu de praktische toepassingen doornemen.

Scenario voor webhostingabonnementen

We beschouwen hier een webhostingserviceprovider wiens (betaalde) services door sommige klanten worden gebruikt. Klanten kunnen ervoor kiezen om maandelijks, driemaandelijks of jaarlijks te betalen - op elk van deze manieren.

Nu gaan we ervan uit dat de klanten begin oktober net betaald hebben. We visualiseren dus een tabelstructuur vanuit het oogpunt van de database als volgt:

Bouw een tafel om bestellingen op te slaan

We moeten een tabel maken om alle bestellingen op te slaan die door de klanten zijn gedaan via een van de beschikbare betalingsopties in de voorbeelddatabase:

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

Vul de tabel als volgt in:

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

Snelle controle

Bekijk de tabel snel door het volgende T-SQL-script uit te voeren:

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

De uitvoer is:

Identificeer het probleem

Alles ziet er goed uit, maar er is een probleem.

We willen alle betalingen van klanten bekijken, ongeacht of ze een maandelijkse, jaarlijkse of driemaandelijkse betaling hebben gedaan. Er lijkt geen manier te zijn om al deze betalingen samen te voegen door NULL's te vermijden, vooral als je werkt aan een rapport met alle bestellingen van klanten en negeert of ze maandelijks, jaarlijks of driemaandelijks hebben betaald.

Ontwerp de oplossing

De oplossing is om de COALESCE-functie te gebruiken. Het voegt al deze betalingswijzen samen en sluit niet-essentiële NULL-waarden uit.

Dit kan eenvoudig als volgt worden bereikt:

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

De uitvoer is:

SQL-weergave gebruiken om de oplossing te verbeteren

We kunnen deze oplossing verbeteren door het script om te zetten in een SQL-weergave en het opnieuw te gebruiken voor analyse en rapportage:

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

Voer de weergave als volgt uit:

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

De resultaten zijn:

Hint:u kunt een SSRS-rapport maken met de SQL-weergave als onderliggende strategie voor het ophalen van gegevens.

Scenario voor zelfverwijzende organisaties

Dit is een ingewikkelder maar vaker voorkomend scenario met betrekking tot levensdatabases.

De eenvoudigste manier om het te begrijpen is door een beroep te doen op de hiërarchische (ouder-kind)relatie. Hier beschouwen we een tabel met alle records van de werknemers en de records van hun managers. Deze tabel bewaart ook elke manager als werknemer aan dezelfde tafel.

We zullen ons hier echter niet volledig concentreren op de relatie tussen werknemer en manager in tabelvorm.

Laten we eens kijken naar een hiërarchie tussen ouder en kind, waarbij elke organisatie tot een hoofdorganisatie behoort. De hoofdorganisatie zelf wordt opgeslagen als een organisatie in dezelfde structuur om een ​​zelfverwijzende relatie te creëren.

De beste manier om dit te begrijpen is door de structuur te bouwen en het zelf te zien.

Bouw een tabel om hoofd- en suborganisaties op te slaan

Maak en vul als volgt een SQL-tabel in de voorbeelddatabase om de master en zijn suborganisaties op te slaan:

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

Snelle controle en analyse

We kunnen de nieuw gemaakte tabel bekijken door de volgende query uit te voeren:

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

Dan krijgen we het volgende resultaat:

We kunnen dus afleiden dat de volgende hoofdorganisaties in de tabel zijn opgeslagen:

  1. CodingSight
  2. CodingSight 2

Als je naar de MasterId-kolom kijkt, kun je zien dat de masterorganisaties NULL MasterId hebben. Het is omdat ze meesterorganisaties zijn.

De volgende organisaties vallen onder de CodingSight-hoofdorganisatie. Ze hebben de MasterId die verwijst naar de CodingSight organisatie:

  1. SQL-blog
  2. SSRS-blog

Hetzelfde geldt voor de volgende suborganisaties onder CodingSight 2 Hoofdorganisatie:

  1. SSAS-blog
  2. SSIS-blog

Probleemstelling

Stel dat we een rapport moeten ontwikkelen van alle artikelen die door deze organisaties zijn gepubliceerd, inclusief hun suborganisaties, maar vertegenwoordigd door de hoofdorganisatie.

In eenvoudige bewoordingen moeten we een rapport maken om alle artikelen weer te geven die zijn gepubliceerd door een hoofdorganisatie, inclusief de artikelen die zijn gepubliceerd door zijn suborganisaties, maar we kunnen de suborganisaties niet noemen.

Ontwerp de oplossing

De COALESCE-functie kan hier erg handig zijn omdat we NULL's voor de hoofdorganisatie moeten tegenkomen, maar het zal niet helpen om hoofd en suborganisatie in de functie te plaatsen.

We proberen bijvoorbeeld artikelen samen te vatten door hun id's als volgt in de functie te verpakken:

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

De uitvoer is:

Laten we nu de uitvoer verbeteren door de gewenste functie als volgt te gebruiken:

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

De uitvoer is:

We hebben de hoofd- en suborganisatie-ID's samengevoegd om het totale aantal artikelen te krijgen dat door deze organisaties is gepubliceerd.

Het script moet ingewikkelder zijn om de gewenste resultaten te krijgen, omdat we suborganisaties eruit moeten filteren zonder de tel van hun artikelen te verliezen. Dat aantal moet worden toegewezen aan hun hoofdorganisaties.

Schrijf het volgende T-SQL-script om dit te bereiken:

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

De uitvoer is:

Gefeliciteerd! We hebben met succes het praktische gebruik van de COALESCE-functie geleerd met betrekking tot enkele interessante realtime scenario's.

Dingen om te doen

Nu u NULL-waarden effectief kunt verwerken en complexe problemen met NULL-waarden kunt oplossen, moet u worden vervangen volgens de zakelijke vereisten. Laten we de volgende dingen proberen om je vaardigheden verder te verbeteren:

  1. Probeer een SQL-weergave te maken en uit te voeren voor het zelfverwijzende organisatiescenario:
  2. Raadpleeg de SSRS-rapportageontwikkeling in eenvoudige bewoordingen artikel en maak een rapport voor het webhostingscenario.
  3. Voeg meer gegevens toe aan de WebOrder tabel door verschillende OrderDate op te geven waarden genoemd in het scenario voor webhostingservices. Verander vervolgens de SQL-weergave in een opgeslagen procedure die de OrderDate . accepteert parameter.
  4. Raadpleeg het Professioneel SSRS-rapport maken op basis van opgeslagen procedure artikel en maak een op besteldatum gebaseerd rapport voor het gewijzigde scenario dat in het vorige punt is besproken.

Lees ook

Topantwoorden op 5 brandende vragen over de SQL COALESCE-functie

Effectief omgaan met de NULL-waarden met de SQL COALESCE-functie voor beginners


  1. Oracle verwijdert geen cursors na het sluiten van de resultatenset

  2. Definieer de stappen voor de SQL Server-cursor - SQL Server / TSQL-zelfstudie

  3. Gegevens ophalen met UTF-8-tekenset van MSSQL-server met behulp van de PHP FreeTDS-extensie

  4. Tijdreeksen genereren tussen twee datums in PostgreSQL