Este artículo habla sobre el uso práctico de la función SQL COALESCE en algunos escenarios de la vida profesional. Resalta la importancia del uso correcto y oportuno de esta función para abordar los problemas relacionados con la base de datos.
Además, implementaremos los pasos particulares requeridos para resolver los problemas con la ayuda de esta función.
Requisitos previos
Antes de prepararse para revisar e implementar los próximos ejemplos de este artículo, se recomienda familiarizarse con los siguientes problemas:
- Conceptos básicos de T-SQL . Los lectores deben conocer bien las secuencias de comandos T-SQL. Además, necesitan escribir y ejecutar cómodamente consultas SQL en bases de datos de ejemplo.
- Conceptos básicos de la función COALESCE . Los lectores deben estar familiarizados con este campo. Si necesita la información para estudiarla, consulte el artículo Función SQL COALESCE que maneja valores NULL de manera efectiva .
Base de datos de muestra
Configure una base de datos de muestra llamada CoalesceUseDB de la siguiente manera:
-- Setup sample database
Create DATABASE CoalesceUseDB;
GO
Alternativamente, puede ejecutar consultas contra tempdb base de datos si prefiere hacerlo.
Reflexiones sobre el uso práctico
Vamos a revisar dos casos prácticos de uso de la función COALESCE. Debemos tener en cuenta que el objetivo principal de esta función es devolver el primer valor no nulo de la lista de entradas (parámetros) que se le pasan – un parámetro también podría ser una columna.
Uno de los enfoques para tales escenarios es usar una estructura de almacenamiento (tabla), que contiene varias columnas. Solo se necesita completar una de esas columnas para generar información significativa.
Pasemos ahora a los usos prácticos.
Escenario de suscripciones de alojamiento web
Aquí, consideramos un proveedor de servicios de alojamiento web cuyos servicios (de pago) son utilizados por algunos clientes. Los clientes pueden optar por pagar mensual, trimestral o anualmente, de cualquiera de estas formas.
Ahora, supongamos que los clientes acaban de pagar a principios de octubre. Por lo tanto, visualizamos una estructura tabular desde el punto de vista de la base de datos de la siguiente manera:
Construir una tabla para almacenar pedidos
Necesitamos crear una tabla para almacenar todos los pedidos realizados por los clientes a través de cualquiera de las opciones de pago disponibles en la base de datos de muestra:
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)
)
Complete la tabla de la siguiente manera:
-- 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')
Comprobación rápida
Eche un vistazo rápido a la tabla ejecutando el siguiente script T-SQL:
-- View WebOrder table
SELECT wo.Id,wo.Customer,wo.YearlyPayment,wo.QuarterlyPayment,wo.MonthlyPayment,wo.OrderDate
FROM dbo.WebOrder wo
La salida es:
Identificar el problema
Todo se ve bien, pero hay un problema.
Queremos ver todos los pagos de los clientes, sin importar si hicieron un pago mensual, anual o trimestral. No parece haber una manera de unir todos estos pagos evitando NULL, especialmente si trabaja en un informe que contiene todos los pedidos de los clientes e ignora si pagaron mensual, anual o trimestralmente.
Diseñar la solución
La solución es usar la función COALESCE. Unirá todos estos modos de pago y excluirá los valores NULL no esenciales.
Esto se puede lograr fácilmente de la siguiente manera:
--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
La salida es:
Uso de SQL View para mejorar la solución
Podemos mejorar esta solución convirtiendo el script en una vista SQL y reutilizándolo para análisis e informes:
-- 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
Ejecute la vista de la siguiente manera:
--Run SQL View to see all the web orders
SELECT awo.Id,awo.Customer,awo.Payment,awo.OrderDate
FROM dbo.AllWebOrders awo
Los resultados son:
Sugerencia:puede crear un informe de SSRS utilizando la vista SQL como estrategia de recuperación de datos subyacente.
Escenario de organizaciones autorreferenciadas
Este es un escenario relacionado con la base de datos de vida más complicado pero más común.
La forma más sencilla de entenderlo es apelando a la relación jerárquica (padre-hijo). Aquí, consideramos una tabla con todos los registros de los empleados y los registros de sus gerentes. Esta tabla también almacena a cada gerente como un empleado en la misma mesa.
Sin embargo, aquí no nos centraremos por completo en la relación tabular empleado-gerente.
Consideremos una jerarquía padre-hijo donde cada organización pertenece a una maestra. La propia organización principal se almacena como una organización en la misma estructura para crear una relación autorreferencial.
La mejor manera de entender esto es construir la estructura y verla usted mismo.
Crear una tabla para almacenar organizaciones maestras y suborganizaciones
Cree y complete una tabla SQL en la base de datos de muestra para almacenar el maestro y sus suborganizaciones de la siguiente manera:
-- 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)
Comprobación y análisis rápidos
Podemos ver la tabla recién creada ejecutando la siguiente consulta:
-- View Organisation table
SELECT o.Id,o.Name,o.MasterId
FROM dbo.Organisation o
Entonces, obtenemos el siguiente resultado:
Por lo tanto, podemos inferir que las siguientes organizaciones maestras están almacenadas en la tabla:
- CodingSight
- CodingSight 2
Si observa la columna MasterId, puede ver que las organizaciones maestras tienen NULL MasterId. Es porque son organizaciones maestras.
Las siguientes organizaciones están bajo la organización principal de CodingSight. Tienen el MasterId apuntando a CodingSight organización:
- Blog de SQL
- Blog de SSRS
Lo mismo se aplica a las siguientes suborganizaciones de CodingSight 2 Organización maestra:
- Blog de SSAS
- Blog de SSIS
Enunciado del problema
Supongamos que necesitamos desarrollar un informe de todos los artículos publicados por estas organizaciones, incluidas sus suborganizaciones, pero representadas por la organización maestra.
En palabras simples, necesitamos crear un informe para mostrar todos los artículos publicados por una organización maestra, incluidos los artículos publicados por sus suborganizaciones, pero no podemos mencionar las suborganizaciones.
Diseñar la solución
La función COALESCE puede ser muy útil aquí, ya que tenemos que encontrar NULL para la organización maestra, pero poner la organización maestra y la suborganización en la función no ayudará.
Por ejemplo, tratamos de resumir artículos envolviendo sus ID en la función de la siguiente manera:
-- 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
La salida es:
Ahora, mejoremos la salida usando la función deseada de la siguiente manera:
-- 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
La salida es:
Hemos fusionado con éxito los ID principales y de suborganizaciones para obtener el número total de artículos publicados por estas organizaciones.
El script tiene que ser más complicado para obtener los resultados deseados, ya que necesitamos filtrar las suborganizaciones sin perder la cuenta de sus artículos. Ese recuento debe asignarse a sus organizaciones maestras.
Escriba el siguiente script T-SQL para lograr esto:
-- 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
La salida es:
¡Felicidades! Hemos aprendido con éxito el uso práctico de la función COALESCE en algunos escenarios interesantes en tiempo real.
Cosas que hacer
Ahora que puede manejar valores NULL de manera efectiva y resolver problemas complejos con valores NULL, debe ser sustituido según los requisitos comerciales. Probemos lo siguiente para mejorar aún más tus habilidades:
- Intente crear y ejecutar una vista SQL para el escenario de organización autorreferencial:
- Consulte el Desarrollo de informes de SSRS en términos simples
- Añadir más datos al Pedido web tabla proporcionando diferentes OrderDate valores mencionados en el escenario de servicios de alojamiento web. Luego, convierta la vista SQL en un procedimiento almacenado que acepte la OrderDate parámetro.
- Consulte Creación de un informe de SSRS profesional basado en un procedimiento almacenado artículo y cree un informe basado en la fecha del pedido para el escenario modificado discutido en el punto anterior.
Leer también
Principales respuestas a 5 preguntas candentes sobre la función SQL COALESCE
Manejo de valores NULL de manera efectiva con la función SQL COALESCE para principiantes