sql >> Databáze >  >> RDS >> Database

Praktické použití funkce SQL COALESCE

Tento článek pojednává o praktickém použití funkce SQL COALESCE s ohledem na některé scénáře profesního života. Zdůrazňuje důležitost správného a včasného použití této funkce pro řešení problémů souvisejících s databází.

S pomocí této funkce navíc implementujeme konkrétní kroky potřebné k vyřešení problémů.

Předpoklady

Než se připravíte na kontrolu a implementaci nadcházejících příkladů v tomto článku, důrazně doporučujeme seznámit se s následujícími problémy:

  • Základy T-SQL . Čtenáři by si měli být dobře vědomi skriptování T-SQL. Potřebují také pohodlně psát a spouštět dotazy SQL proti vzorovým databázím.
  • Základy funkce COALESCE . Čtenáři musí být obeznámeni s tímto oborem. Pokud potřebujete informace k jejich prostudování, přečtěte si článek SQL COALESCE Function Handling NULL Values ​​Effective .

Ukázka databáze

Nastavte ukázkovou databázi s názvem CoalesceUseDB takto:

-- Setup sample database
Create DATABASE CoalesceUseDB;
GO

Případně můžete spouštět dotazy proti tempdb databázi, pokud to chcete udělat.

Myšlenky na praktické použití

Probereme dva praktické případy použití funkce COALESCE. Měli bychom mít na paměti, že hlavním cílem této funkce je vrátit první hodnotu Non-Null ze seznamu vstupů (parametrů), které jsou jí předávány – parametr může být také sloupec.

Jedním z přístupů k takovým scénářům je použití struktury úložiště (tabulky), která obsahuje více sloupců. Aby byly informace smysluplné, stačí vyplnit pouze jeden z těchto sloupců.

Pojďme si nyní projít praktická použití.

Scénář předplatného webhostingu

Zde uvažujeme poskytovatele webhostingových služeb, jehož (placené) služby někteří zákazníci využívají. Zákazníci si mohou vybrat, zda budou platit měsíčně, čtvrtletně nebo ročně – kterýmkoli z těchto způsobů.

Nyní předpokládáme, že zákazníci zaplatili právě na začátku října. Tabulkovou strukturu si tedy z databázového pohledu vizualizujeme následovně:

Vytvořte tabulku pro ukládání objednávek

Potřebujeme sestavit tabulku pro ukládání všech objednávek provedených zákazníky prostřednictvím kterékoli z dostupných platebních možností oproti vzorové databázi:

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

Naplňte tabulku následovně:

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

Rychlá kontrola

Podívejte se rychle na tabulku spuštěním následujícího skriptu T-SQL:

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

Výstup je:

Identifikujte problém

Všechno vypadá dobře, ale je tu problém.

Chceme se podívat na všechny platby zákazníků bez ohledu na to, zda provedli měsíční, roční nebo čtvrtletní platbu. Zdá se, že neexistuje způsob, jak spojit všechny tyto platby dohromady a vyhnout se NULL, zvláště pokud pracujete na sestavě obsahující všechny objednávky zákazníků a ignorujete, zda platili měsíčně, ročně nebo čtvrtletně.

Navrhněte řešení

Řešením je použití funkce COALESCE. Spojí všechny tyto platební režimy dohromady a vyloučí nepodstatné hodnoty NULL.

Toho lze snadno dosáhnout následovně:

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

Výstup je:

Vylepšení řešení pomocí zobrazení SQL

Toto řešení můžeme vylepšit převedením skriptu na zobrazení SQL a jeho opětovným použitím pro analýzu a vytváření sestav:

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

Spusťte zobrazení následovně:

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

Výsledky jsou:

Tip:Sestavu SSRS můžete vytvořit pomocí zobrazení SQL jako základní strategie načítání dat.

Scénář samoodkazujících organizací

Toto je složitější, ale běžnější scénář související s databází života.

Nejjednodušší způsob, jak to pochopit, je apelovat na hierarchický vztah (rodič-dítě). Zde uvažujeme tabulku se všemi záznamy zaměstnanců a záznamy jejich manažerů. Tato tabulka také ukládá každého manažera jako zaměstnance u stejného stolu.

Zde se však zcela nezaměříme na tabulkový vztah zaměstnance a manažera.

Vezměme si hierarchii rodič-dítě, kde každá organizace patří do nadřízené. Samotná hlavní organizace je uložena jako organizace ve stejné struktuře, aby se vytvořil vztah s odkazem na sebe.

Nejlepší způsob, jak tomu porozumět, je postavit strukturu a sami ji vidět.

Vytvořte tabulku pro uložení hlavních a podřízených organizací

Vytvořte a naplňte tabulku SQL ve vzorové databázi pro uložení hlavní a jejích podorganizací následovně:

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

Rychlá kontrola a analýza

Nově vytvořenou tabulku můžeme zobrazit spuštěním následujícího dotazu:

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

Potom dostaneme následující výsledek:

Můžeme tedy odvodit, že v tabulce jsou uloženy následující hlavní organizace:

  1. CodingSight
  2. CodingSight 2

Pokud se podíváte na sloupec MasterId, můžete vidět, že hlavní organizace mají NULL MasterId. Je to proto, že jsou to hlavní organizace.

Následující organizace spadají pod hlavní organizaci CodingSight. Mají MasterId ukazující na CodingSight organizace:

  1. Blog SQL
  2. Blog SSRS

Totéž platí pro následující podorganizace pod CodingSight 2 Hlavní organizace:

  1. Blog SSAS
  2. Blog SSIS

Prohlášení o problému

Předpokládejme, že potřebujeme vytvořit zprávu o všech článcích publikovaných těmito organizacemi, včetně jejich podřízených organizací, ale zastoupených hlavní organizací.

Jednoduše řečeno, musíme vytvořit sestavu, která zobrazí všechny články publikované hlavní organizací, včetně článků publikovaných jejími podorganizacemi, ale nemůžeme zmínit podorganizace.

Navrhněte řešení

Funkce COALESCE zde může být velmi užitečná, protože se musíme setkat s hodnotami NULL pro hlavní organizaci, ale vložení hlavní a podorganizace do funkce nepomůže.

Snažíme se například shrnout články tak, že jejich ID zabalíme do funkce takto:

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

Výstup je:

Nyní vylepšíme výstup použitím požadované funkce následovně:

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

Výstup je:

Úspěšně jsme sloučili ID hlavních a podřízených organizací, abychom získali celkový počet článků publikovaných těmito organizacemi.

Abychom dosáhli požadovaných výsledků, skript musí být složitější, protože potřebujeme odfiltrovat podorganizace, aniž bychom ztratili počet jejich článků. Tento počet by měl být přidělen jejich hlavním organizacím.

Chcete-li toho dosáhnout, napište následující skript T-SQL:

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

Výstup je:

Gratulujeme! Úspěšně jsme se naučili praktické použití funkce COALESCE týkající se některých zajímavých scénářů v reálném čase.

Co dělat

Nyní, když můžete efektivně zacházet s hodnotami NULL a řešit složité problémy s hodnotami NULL, musíte být nahrazeni podle obchodních požadavků. Vyzkoušejte následující věci, abyste své dovednosti dále zlepšili:

  1. Zkuste vytvořit a spustit zobrazení SQL pro scénář organizace s vlastními odkazy:
  2. Viz Zjednodušený vývoj přehledů SSRS článek a vytvořte zprávu pro scénář webhostingu.
  3. Přidejte další data do WebOrder tabulky zadáním jiného Datum objednávky hodnoty uvedené ve scénáři webhostingových služeb. Poté změňte zobrazení SQL na uloženou proceduru, která přijímá Datum objednávky parametr.
  4. Viz Vytvoření profesionální zprávy SSRS na základě uložené procedury článku a sestavte sestavu na základě data objednávky pro upravený scénář, o kterém jsme pojednávali v předchozím bodě.

Přečtěte si také

Nejlepší odpovědi na 5 ožehavých otázek ohledně funkce SQL COALESCE

Efektivní zpracování hodnot NULL pomocí funkce SQL COALESCE pro začátečníky


  1. Použití poddotazu v příkazu Check v Oracle

  2. PostgreSQL je nejlepší databáze na světě

  3. Nasaďte databázi Hybrid Cloud MySQL pomocí ClusterControl

  4. Jak funguje funkce Radians() v PostgreSQL