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

Eine praktische Verwendung der SQL COALESCE-Funktion

Dieser Artikel spricht über die praktische Verwendung der SQL COALESCE-Funktion in Bezug auf einige Szenarien des Berufslebens. Es hebt die Bedeutung der korrekten und rechtzeitigen Verwendung dieser Funktion hervor, um die datenbankbezogenen Probleme anzugehen.

Zusätzlich werden wir mit Hilfe dieser Funktion die zur Lösung des Problems erforderlichen konkreten Schritte umsetzen.

Voraussetzungen

Bevor Sie sich darauf vorbereiten, die nächsten Beispiele in diesem Artikel zu überprüfen und zu implementieren, sollten Sie sich unbedingt mit den folgenden Themen vertraut machen:

  • T-SQL-Grundlagen . Leser sollten mit T-SQL-Skripting vertraut sein. Außerdem müssen sie bequem SQL-Abfragen für Beispieldatenbanken schreiben und ausführen können.
  • Grundlagen der COALESCE-Funktion . Leser müssen mit diesem Bereich vertraut sein. Wenn Sie die Informationen benötigen, um sie zu studieren, lesen Sie den Artikel SQL COALESCE-Funktion, die NULL-Werte effektiv verarbeitet .

Beispieldatenbank

Richten Sie eine Beispieldatenbank namens CoalesceUseDB ein wie folgt:

-- Setup sample database
Create DATABASE CoalesceUseDB;
GO

Alternativ können Sie Abfragen für die tempdb ausführen Datenbank, wenn Sie dies bevorzugen.

Gedanken zur praktischen Anwendung

Wir werden zwei praktische Anwendungsfälle der COALESCE-Funktion überprüfen. Wir sollten bedenken, dass das Hauptziel dieser Funktion darin besteht, den ersten Nicht-Null-Wert aus der Liste der an sie übergebenen Eingaben (Parameter) zurückzugeben – Ein Parameter kann auch eine Spalte sein.

Einer der Ansätze für solche Szenarien ist die Verwendung einer Speicherstruktur (Tabelle), die mehrere Spalten enthält. Nur eine dieser Spalten muss ausgefüllt werden, um aussagekräftige Informationen zu erhalten.

Lassen Sie uns nun die praktischen Anwendungen durchgehen.

Szenario für Webhosting-Abonnements

Hier betrachten wir einen Webhosting-Dienstleister, dessen (kostenpflichtige) Dienste von einigen Kunden in Anspruch genommen werden. Kunden können wählen, ob sie monatlich, vierteljährlich oder jährlich zahlen möchten – auf jede dieser Arten.

Nun nehmen wir an, dass die Kunden Anfang Oktober gerade bezahlt haben. So stellen wir uns aus Datenbanksicht eine tabellarische Struktur wie folgt vor:

Erstellen Sie eine Tabelle, um Bestellungen zu speichern

Wir müssen eine Tabelle erstellen, um alle Bestellungen zu speichern, die von den Kunden über eine der verfügbaren Zahlungsoptionen für die Beispieldatenbank getätigt wurden:

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

Füllen Sie die Tabelle wie folgt aus:

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

Schnellcheck

Werfen Sie einen kurzen Blick auf die Tabelle, indem Sie das folgende T-SQL-Skript ausführen:

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

Die Ausgabe ist:

Identifizieren Sie das Problem

Alles sieht gut aus, aber es gibt ein Problem.

Wir möchten uns alle Zahlungen der Kunden ansehen, unabhängig davon, ob sie eine monatliche, jährliche oder vierteljährliche Zahlung geleistet haben. Es scheint keine Möglichkeit zu geben, all diese Zahlungen zusammenzuführen, indem Sie NULL vermeiden, insbesondere wenn Sie an einem Bericht arbeiten, der alle Bestellungen der Kunden enthält, und ignorieren, ob sie monatlich, jährlich oder vierteljährlich bezahlt haben.

Entwerfen Sie die Lösung

Die Lösung ist die Verwendung der COALESCE-Funktion. Es wird alle diese Zahlungsarten zusammenführen und unwesentliche NULL-Werte ausschließen.

Dies kann einfach wie folgt erreicht werden:

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

Die Ausgabe ist:

Verwendung der SQL-Ansicht zur Verbesserung der Lösung

Wir können diese Lösung verbessern, indem wir das Skript in eine SQL-Ansicht umwandeln und es für Analysen und Berichte wiederverwenden:

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

Führen Sie die Ansicht wie folgt aus:

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

Die Ergebnisse sind:

Hinweis:Sie können einen SSRS-Bericht erstellen, indem Sie die SQL-Ansicht als zugrunde liegende Datenabrufstrategie verwenden.

Szenario für selbstreferenzierende Organisationen

Dies ist ein komplizierteres, aber häufigeres Szenario im Zusammenhang mit Lebensdatenbanken.

Der einfachste Weg, es zu verstehen, ist die Berufung auf die hierarchische (Eltern-Kind-)Beziehung. Hier betrachten wir eine Tabelle mit allen Datensätzen der Mitarbeiter und deren Managern. Diese Tabelle speichert auch jeden Manager als Mitarbeiter an derselben Tabelle.

Wir werden uns hier jedoch nicht ausschließlich auf die tabellarische Beziehung zwischen Mitarbeiter und Vorgesetztem konzentrieren.

Betrachten wir eine Eltern-Kind-Hierarchie, in der jede Organisation zu einer Master-Organisation gehört. Die Master-Organisation selbst wird als Organisation in derselben Struktur gespeichert, um eine selbstreferenzierende Beziehung herzustellen.

Der beste Weg, dies zu verstehen, ist, die Struktur zu bauen und sie selbst zu sehen.

Erstellen Sie eine Tabelle zum Speichern von Master- und Unterorganisationen

Erstellen und füllen Sie eine SQL-Tabelle in der Beispieldatenbank, um den Master und seine untergeordneten Organisationen wie folgt zu speichern:

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

Schnellprüfung und Analyse

Wir können die neu erstellte Tabelle anzeigen, indem wir die folgende Abfrage ausführen:

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

Dann erhalten wir das folgende Ergebnis:

Daraus können wir schließen, dass die folgenden Stammorganisationen in der Tabelle gespeichert sind:

  1. CodingSight
  2. CodingSight 2

Wenn Sie sich die MasterId-Spalte ansehen, sehen Sie, dass die Master-Organisationen NULL MasterId haben. Weil sie Meisterorganisationen sind.

Die folgenden Organisationen sind unter der CodingSight-Master-Organisation. Sie haben die MasterId, die auf CodingSight zeigt Organisation:

  1. SQL-Blog
  2. SSRS-Blog

Dasselbe gilt für die folgenden Unterorganisationen unter CodingSight 2 Master-Organisation:

  1. SSAS-Blog
  2. SSIS-Blog

Problemstellung

Angenommen, wir müssen einen Bericht über alle Artikel erstellen, die von diesen Organisationen veröffentlicht wurden, einschließlich ihrer Unterorganisationen, die jedoch von der Hauptorganisation vertreten werden.

Mit einfachen Worten, wir müssen einen Bericht erstellen, um alle Artikel anzuzeigen, die von einer Hauptorganisation veröffentlicht wurden, einschließlich der Artikel, die von ihren Unterorganisationen veröffentlicht wurden, aber wir können die Unterorganisationen nicht erwähnen.

Entwerfen Sie die Lösung

Die COALESCE-Funktion kann hier sehr praktisch sein, da wir auf NULLen für die Master-Organisation stoßen müssen, aber das Einfügen von Master und Sub-Organisation in die Funktion wird nicht helfen.

Zum Beispiel versuchen wir, Artikel zusammenzufassen, indem wir ihre IDs wie folgt in die Funktion einschließen:

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

Die Ausgabe ist:

Lassen Sie uns nun die Ausgabe verbessern, indem Sie die gewünschte Funktion wie folgt verwenden:

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

Die Ausgabe ist:

Wir haben die IDs von Haupt- und Unterorganisationen erfolgreich zusammengeführt, um die Gesamtzahl der von diesen Organisationen veröffentlichten Artikel zu erhalten.

Das Skript muss komplizierter sein, um die gewünschten Ergebnisse zu erzielen, da wir Unterorganisationen herausfiltern müssen, ohne die Anzahl ihrer Artikel zu verlieren. Diese Anzahl sollte ihren Hauptorganisationen zugewiesen werden.

Schreiben Sie dazu das folgende T-SQL-Skript:

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

Die Ausgabe ist:

Herzliche Glückwünsche! Wir haben den praktischen Einsatz der COALESCE-Funktion anhand einiger interessanter Echtzeitszenarien erfolgreich erlernt.

Dinge zu tun

Jetzt, da Sie NULL-Werte effektiv handhaben und komplexe Probleme mit NULL-Werten lösen können, müssen Sie gemäß den Geschäftsanforderungen ersetzt werden. Lassen Sie uns die folgenden Dinge ausprobieren, um Ihre Fähigkeiten weiter zu verbessern:

  1. Versuchen Sie, eine SQL-Ansicht für das auf sich selbst verweisende Organisationsszenario zu erstellen und auszuführen:
  2. Beziehen Sie sich auf die Entwicklung von SSRS-Berichten in einfachen Begriffen Artikel und erstellen Sie einen Bericht für das Webhosting-Szenario.
  3. Fügen Sie dem WebOrder weitere Daten hinzu Tabelle, indem Sie ein anderes OrderDate angeben Werte, die im Webhosting-Services-Szenario erwähnt werden. Wandeln Sie dann die SQL-Ansicht in eine gespeicherte Prozedur um, die das OrderDate akzeptiert Parameter.
  4. Weitere Informationen finden Sie im Erstellen eines professionellen SSRS-Berichts basierend auf einer gespeicherten Prozedur Artikel und erstellen Sie einen auf dem Bestelldatum basierenden Bericht für das im vorherigen Punkt besprochene modifizierte Szenario.

Lesen Sie auch

Top-Antworten auf 5 brennende Fragen zur SQL COALESCE-Funktion

Effektiver Umgang mit NULL-Werten mit der SQL COALESCE-Funktion für Anfänger