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

En praktisk brug af SQL COALESCE-funktionen

Denne artikel taler om den praktiske brug af SQL COALESCE-funktionen i forbindelse med nogle professionelle livsscenarier. Det fremhæver vigtigheden af ​​korrekt og rettidig brug af denne funktion for at løse de databaserelaterede problemer.

Derudover vil vi implementere de særlige trin, der kræves for at løse problemerne ved hjælp af denne funktion.

Forudsætninger

Før du forbereder dig på at gennemgå og implementere de kommende eksempler i denne artikel, anbefales det stærkt at blive fortrolig med følgende problemer:

  • Grundlæggende om T-SQL . Læsere bør være udmærket opmærksomme på T-SQL scripting. De skal også nemt skrive og køre SQL-forespørgsler mod eksempeldatabaser.
  • Grundlæggende om COALESCE-funktionen . Læsere skal være fortrolige med dette felt. Hvis du har brug for oplysningerne for at studere dem, henvises til artiklen SQL COALESCE-funktion, der håndterer NULL-værdier effektivt .

Eksempeldatabase

Konfigurer en eksempeldatabase kaldet CoalesceUseDB som følger:

-- Setup sample database
Create DATABASE CoalesceUseDB;
GO
 

Alternativt kan du køre forespørgsler mod tempdb database, hvis du foretrækker at gøre det.

Tanker om praktisk brug

Vi vil gennemgå to praktiske brugssager af COALESCE-funktionen. Vi bør huske på, at hovedformålet med denne funktion er at returnere den første Ikke-Null værdi fra listen over input (parametre), der sendes til den – aparameter kunne også være en kolonne.

En af tilgangene til sådanne scenarier er at bruge en lagerstruktur (tabel), som indeholder flere kolonner. Kun én af disse kolonner skal udfyldes for at give meningsfuld information.

Lad os nu gennemgå de praktiske anvendelser.

Scenario for webhostingabonnement

Her betragter vi en udbyder af webhostingtjenester, hvis (betalte) tjenester bruges af nogle kunder. Kunder kan vælge at betale månedligt, kvartalsvis eller årligt – på en af ​​disse måder.

Nu formoder vi, at kunderne lige har betalt i begyndelsen af ​​oktober. Således visualiserer vi en tabelstruktur fra databasens synspunkt som følger:

Byg et bord til at gemme ordrer

Vi er nødt til at bygge en tabel til at gemme alle ordrer lavet af kunderne via en af ​​de tilgængelige betalingsmuligheder mod prøvedatabasen:

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

Udfyld tabellen som følger:

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

Hurtigt tjek

Kig hurtigt på tabellen ved at køre følgende T-SQL-script:

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

Outputtet er:

Identificer problemet

Alt ser godt ud, men der er et problem.

Vi ønsker at se på alle kunders betalinger, uanset om de har foretaget en månedlig, årlig eller kvartalsvis betaling. Der lader ikke til at være en måde at kombinere alle disse betalinger ved at undgå NULL, især hvis du arbejder på en rapport, der indeholder alle kundernes ordrer og ignorerer, om de betalte månedligt, årligt eller kvartalsvis.

Design løsningen

Løsningen er at bruge COALESCE-funktionen. Det vil samle alle disse betalingsmåder og udelukke ikke-essentielle NULL-værdier.

Dette kan nemt opnås på følgende måde:

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

Outputtet er:

Brug af SQL View til at forbedre løsningen

Vi kan forbedre denne løsning ved at omdanne scriptet til en SQL-visning og genbruge det til analyse og rapportering:

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

Kør visningen som følger:

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

Resultaterne er:

Tip:du kan bygge en SSRS-rapport ved hjælp af SQL-visningen som en underliggende datahentningsstrategi.

Selvhenvisende organisationers scenarie

Dette er et mere kompliceret, men mere almindeligt livsdatabaserelateret scenario.

Den enkleste måde at forstå det på er at appellere til det hierarkiske (forælder-barn) forhold. Her betragter vi en tabel med alle medarbejdernes optegnelser og deres lederes optegnelser. Denne tabel gemmer også hver leder som medarbejder ved samme bord.

Vi vil dog ikke fokusere helt på medarbejder-leder-tabelforholdet her.

Lad os overveje et forældre-barn-hierarki, hvor hver organisation tilhører en master. Selve masterorganisationen lagres som en organisation i samme struktur for at skabe et selvrefererende forhold.

Den bedste måde at forstå dette på er at bygge strukturen og se den selv.

Byg et bord til at opbevare master og underorganisationer

Opret og udfyld en SQL-tabel i eksempeldatabasen for at gemme masteren og dens underorganisationer som følger:

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

Hurtig kontrol og analyse

Vi kan se den nyoprettede tabel ved at køre følgende forespørgsel:

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

Så får vi følgende resultat:

Vi kan således udlede, at følgende masterorganisationer er gemt i tabellen:

  1. CodingSight
  2. CodingSight 2

Hvis du ser på kolonnen MasterId, kan du se, at masterorganisationerne har NULL MasterId. Det er fordi de er mesterorganisationer.

Følgende organisationer er under CodingSight-masterorganisationen. De har MasterId'et, der peger på CodingSight organisation:

  1. SQL-blog
  2. SSRS-blog

Det samme gælder for følgende underorganisationer under CodingSight 2 Hovedorganisation:

  1. SSAS-blog
  2. SSIS-blog

Problemerklæring

Antag, at vi er nødt til at udvikle en rapport over alle artikler udgivet af disse organisationer, inklusive deres underorganisationer, men repræsenteret af masterorganisationen.

Med enkle ord skal vi bygge en rapport for at vise alle artikler, der er udgivet af en masterorganisation, inklusive de artikler, der er udgivet af dens underorganisationer, men vi kan ikke nævne underorganisationerne.

Design løsningen

COALESCE-funktionen kan være meget praktisk her, da vi skal støde på NULLs for masterorganisationen, men det hjælper ikke at sætte master og underorganisation i funktionen.

For eksempel forsøger vi at opsummere artikler ved at pakke deres id'er ind i funktionen som følger:

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

Outputtet er:

Lad os nu forbedre outputtet ved at bruge den ønskede funktion som følger:

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

Outputtet er:

Vi har med succes slået hoved- og underorganisations-id'er sammen for at få det samlede antal artikler udgivet af disse organisationer.

Scriptet skal være mere kompliceret for at få de ønskede resultater, da vi skal filtrere underorganisationer ud uden at miste antallet af deres artikler. Denne optælling bør tildeles deres masterorganisationer.

Skriv følgende T-SQL-script for at opnå dette:

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

Outputtet er:

Tillykke! Vi har med succes lært den praktiske brug af COALESCE-funktionen vedrørende nogle interessante realtidsscenarier.

Ting at gøre

Nu hvor du kan håndtere NULL-værdier effektivt og løse komplekse problemer med NULL-værdier, skal du erstattes i henhold til forretningskrav. Lad os prøve følgende ting for at forbedre dine færdigheder yderligere:

  1. Prøv at oprette og køre en SQL-visning for scenariet med selvreferenceorganisation:
  2. Se SSRS-rapportudvikling i enkle vendinger artikel og opret en rapport for webhosting-scenariet.
  3. Tilføj flere data til WebOrder tabel ved at angive forskellige OrderDate værdier nævnt i scenariet for webhostingtjenester. Gør derefter SQL-visningen til en lagret procedure, der accepterer OrderDate parameter.
  4. Se Oprettelse af professionel SSRS-rapport baseret på lagret procedure artikel og opbyg en ordredato-baseret rapport for det ændrede scenarie, der blev diskuteret i det foregående punkt.

Læs også

Topsvar på 5 brændende spørgsmål om SQL COALESCE-funktion

Håndtering af NULL-værdierne effektivt med SQL COALESCE-funktionen for begyndere


  1. Hvor hurtigt er ODBC? En "belastet" sammenligning.

  2. n. percentilberegninger i postgresql

  3. MySQL HVOR I ()

  4. TNS-12505:TNS:listener kender i øjeblikket ikke til SID givet i forbindelsesbeskrivelsen