Database
 sql >> Baza danych >  >> RDS >> Database

Praktyczne zastosowanie funkcji SQL COALESCE

W tym artykule omówiono praktyczne zastosowanie funkcji SQL COALESCE w niektórych scenariuszach życia zawodowego. Podkreśla znaczenie prawidłowego i terminowego korzystania z tej funkcji w celu rozwiązania problemów związanych z bazą danych.

Dodatkowo wdrożymy poszczególne kroki wymagane do rozwiązania problemów za pomocą tej funkcji.

Warunki wstępne

Zanim przygotujesz się do przejrzenia i wdrożenia nadchodzących przykładów w tym artykule, zdecydowanie zalecamy zapoznanie się z następującymi kwestiami:

  • Podstawy T-SQL . Czytelnicy powinni być świadomi obsługi skryptów T-SQL. Ponadto muszą wygodnie pisać i uruchamiać zapytania SQL w przykładowych bazach danych.
  • Podstawy funkcji COALESCE . Czytelnicy muszą znać tę dziedzinę. Jeśli potrzebujesz informacji, aby je przestudiować, zapoznaj się z artykułem Skuteczna obsługa wartości NULL przez funkcję SQL COALESCE .

Przykładowa baza danych

Skonfiguruj przykładową bazę danych o nazwie CoalesceUseDB w następujący sposób:

-- Setup sample database
Create DATABASE CoalesceUseDB;
GO

Alternatywnie możesz uruchamiać zapytania w tempdb bazy danych, jeśli wolisz to zrobić.

Myśli o praktycznym użyciu

Omówimy dwa praktyczne przypadki użycia funkcji COALESCE. Należy pamiętać, że głównym celem tej funkcji jest zwrócenie pierwszej wartości Non-Null z listy danych wejściowych (parametrów), które są do niej przekazywane – parametr może być również kolumną.

Jednym z podejść do takich scenariuszy jest użycie struktury pamięci (tabeli), która zawiera wiele kolumn. Tylko jedna z tych kolumn musi być wypełniona, aby uzyskać znaczące informacje.

Przejdźmy teraz przez praktyczne zastosowania.

Scenariusz subskrypcji hostingu internetowego

Rozważamy tutaj dostawcę usług hostingowych, z którego (płatnych) usług korzystają niektórzy klienci. Klienci mogą wybrać płatność miesięczną, kwartalną lub roczną – w dowolny z tych sposobów.

Teraz przypuszczamy, że klienci zapłacili właśnie na początku października. W ten sposób wizualizujemy strukturę tabelaryczną z punktu widzenia bazy danych w następujący sposób:

Zbuduj stół do przechowywania zamówień

Musimy zbudować tabelę do przechowywania wszystkich zamówień złożonych przez klientów za pomocą dowolnej z dostępnych opcji płatności w oparciu o przykładową bazę danych:

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

Wypełnij tabelę w następujący sposób:

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

Szybkie sprawdzenie

Rzuć okiem na tabelę, uruchamiając następujący skrypt T-SQL:

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

Dane wyjściowe to:

Zidentyfikuj problem

Wszystko wygląda dobrze, ale jest problem.

Chcemy przyjrzeć się wszystkim płatnościom klientów, niezależnie od tego, czy dokonywali płatności miesięcznej, rocznej czy kwartalnej. Wydaje się, że nie ma sposobu na połączenie wszystkich tych płatności, unikając wartości NULL, zwłaszcza jeśli pracujesz nad raportem zawierającym wszystkie zamówienia klientów i ignorujesz, czy płacili miesięcznie, rocznie czy kwartalnie.

Zaprojektuj rozwiązanie

Rozwiązaniem jest użycie funkcji COALESCE. Połączy wszystkie te tryby płatności razem i wykluczy nieistotne wartości NULL.

Można to łatwo osiągnąć w następujący sposób:

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

Dane wyjściowe to:

Korzystanie z widoku SQL do ulepszania rozwiązania

Możemy ulepszyć to rozwiązanie, zmieniając skrypt w widok SQL i ponownie wykorzystując go do analizy i raportowania:

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

Uruchom widok w następujący sposób:

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

Wyniki to:

Wskazówka:możesz zbudować raport SSRS, używając widoku SQL jako podstawowej strategii wyszukiwania danych.

Scenariusz organizacji samoodnoszących się

Jest to bardziej skomplikowany, ale bardziej powszechny scenariusz związany z bazą danych.

Najprostszym sposobem zrozumienia tego jest odwołanie się do hierarchicznej relacji (rodzic-dziecko). Rozważamy tutaj tabelę zawierającą wszystkie rekordy pracowników i rekordy ich menedżerów. Ta tabela przechowuje również każdego menedżera jako pracownika przy tym samym stole.

Jednak nie skupimy się tutaj całkowicie na relacjach tabelarycznych pracownik-kierownik.

Rozważmy hierarchię rodzic-dziecko, w której każda organizacja należy do organizacji nadrzędnej. Sama organizacja nadrzędna jest przechowywana jako organizacja w tej samej strukturze, aby utworzyć relację samoodniesienia.

Najlepszym sposobem na zrozumienie tego jest zbudowanie struktury i zobaczenie jej samodzielnie.

Zbuduj stół, aby przechowywać organizację nadrzędną i podrzędną

Utwórz i wypełnij tabelę SQL w przykładowej bazie danych, aby przechowywać nadrzędną i jej organizacje podrzędne w następujący sposób:

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

Szybkie sprawdzenie i analiza

Możemy wyświetlić nowo utworzoną tabelę, uruchamiając następujące zapytanie:

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

Następnie otrzymujemy następujący wynik:

W związku z tym możemy wywnioskować, że w tabeli przechowywane są następujące organizacje nadrzędne:

  1. Widok kodowania
  2. CodingSight 2

Jeśli spojrzysz na kolumnę MasterId, zobaczysz, że organizacje nadrzędne mają NULL MasterId. To dlatego, że są to organizacje nadrzędne.

Następujące organizacje należą do organizacji nadrzędnej CodingSight. Mają MasterId wskazujący na CodingSight organizacja:

  1. Blog SQL
  2. Blog SSRS

To samo dotyczy następujących organizacji podrzędnych w ramach CodingSight 2 Organizacja główna:

  1. Blog SSAS
  2. Blog SSIS

Opis problemu

Załóżmy, że musimy opracować raport wszystkich artykułów opublikowanych przez te organizacje, w tym ich podorganizacje, ale reprezentowanych przez organizację główną.

Krótko mówiąc, musimy stworzyć raport, aby pokazać wszystkie artykuły opublikowane przez organizację nadrzędną, w tym artykuły opublikowane przez jej organizacje podrzędne, ale nie możemy wspomnieć o organizacjach podrzędnych.

Zaprojektuj rozwiązanie

Funkcja COALESCE może być tutaj bardzo przydatna, ponieważ musimy napotkać wartości NULL dla organizacji nadrzędnej, ale umieszczenie organizacji nadrzędnej i podrzędnej w funkcji nie pomoże.

Na przykład próbujemy podsumować artykuły, umieszczając ich identyfikatory w funkcji w następujący sposób:

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

Dane wyjściowe to:

Teraz poprawmy wynik, używając żądanej funkcji w następujący sposób:

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

Dane wyjściowe to:

Pomyślnie połączyliśmy identyfikatory organizacji nadrzędnej i podrzędnej, aby uzyskać łączną liczbę artykułów opublikowanych przez te organizacje.

Skrypt musi być bardziej skomplikowany, aby uzyskać pożądane wyniki, ponieważ musimy odfiltrować organizacje podrzędne bez utraty liczby ich artykułów. Liczba ta powinna być przypisana do ich organizacji nadrzędnych.

Aby to osiągnąć, napisz następujący skrypt 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

Dane wyjściowe to:

Gratulacje! Pomyślnie nauczyliśmy się praktycznego zastosowania funkcji COALESCE w odniesieniu do kilku interesujących scenariuszy czasu rzeczywistego.

Rzeczy do zrobienia

Teraz, gdy możesz efektywnie obsługiwać wartości NULL i rozwiązywać złożone problemy z wartościami NULL, musisz zastąpić je zgodnie z wymaganiami biznesowymi. Wypróbujmy następujące rzeczy, aby jeszcze bardziej poprawić swoje umiejętności:

  1. Spróbuj utworzyć i uruchomić widok SQL dla scenariusza organizacji samoodnoszącej się:
  2. Zapoznaj się z Prostym terminem tworzenia raportów SSRS artykuł i utwórz raport dotyczący scenariusza hostingu.
  3. Dodaj więcej danych do WebOrder tabeli, podając inną DataZamówienia wartości wymienione w scenariuszu usług hostingowych. Następnie zmień widok SQL w procedurę składowaną, która akceptuje OrderDate parametr.
  4. Patrz Tworzenie profesjonalnego raportu SSRS na podstawie zapisanej procedury artykuł i zbuduj raport oparty na dacie zamówienia dla zmodyfikowanego scenariusza omówionego w poprzednim punkcie.

Czytaj także

Najlepsze odpowiedzi na 5 palących pytań dotyczących funkcji SQL COALESCE

Skuteczna obsługa wartości NULL za pomocą funkcji SQL COALESCE dla początkujących


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najbliższy mecz, część 2

  2. Daj się zapalić dzięki Apache Spark – część 2

  3. OGRANICZENIE KLUCZA OBCEGO SQL:Kompletny, łatwy przewodnik dla początkujących

  4. Jak działa logowanie na połączonych serwerach (przykłady T-SQL)

  5. Notacja strzałkowa