es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

MSSQL: unir a la izquierda múltiples columnas en tres tablas

Tengo tres tablas en MS SQL Server:

Tenants:
TenantID int,
LastName varchar(50),
FirstName varchar(50)

Intervals:
Value int,
Name varchar(50)

Leases:
LeaseID int,
Interval int,
StartDate date,
EndDate date,
Tenant1 int,
Tenant2 int,
Tenant3 int,
Tenant4 int

La tabla Intervals tiene tres filas: [1, ‘Mensual’], [2, ‘Quincenal’] y [3, ‘Semanal’]

Necesito una consulta que tenga este conjunto de resultados:

LID Tipo Inicio Fin Inquilino1 Inquilino2 Inquilino3 Inquilino4
21 Mensual 15/12/2019 15/12/2020 Sean Murphy Audrey Moore Randy Davis
32 Semanal 01/06/2018 Pete Higgins Kathy Higgins
35 Mensual 01/08/2019 31/10/2020 Andy Stacke Valerie Stacke
44 Mensual 01/01/2021 Pete O’Toole Martha White

Dejando de lado la columna de nombre y apellido por ahora, mi primer intento utilizó dos uniones izquierdas exitosamente:

select L.LeaseID, I.Name as Tipo, L.StartDate, L.EndDate, T.LastName as Inquilino1
from Leases L
left join Intervals I on I.value=L.Interval
left join Tenants T on T.TenantID = L.Tenant1

y devolvió esto:

LID Tipo Inicio Fin Inquilino1
21 Mensual 15/12/2019 15/12/2020 Murphy
32 Semanal 01/06/2018 Higgins
35 Mensual 01/08/2019 31/10/2020 Stacke
44 Mensual 01/01/2021 O’Toole

Un buen comienzo, pero no parece ser capaz de obtener hasta 4 nombres únicos de la tabla Tenants, y me gustaría combinar (nombre+apellido) en las columnas de inquilinos.

Intenté múltiples uniones izquierdas para la misma tabla (tenants), y condiciones OR en una unión; ambas parecían intuitivamente incorrectas.

select L.lid,L.ruid, I.Name, T.LastName as Inquilino1, T.LastName as Inquilino2 from Leases L
left join Intervals I on I.value=L.Interval
left join Tenants T on T.TenantID = L.Tenant1
left join Tenants T on T.TenantID = L.Tenant2

select L.lid,L.ruid, I.Name, T.LastName as Inquilino1, T.LastName as Inquilino2 from Leases L
left join Intervals I on I.value=L.Interval
left join Tenants T on T.TenantID = L.Tenant1 or T.TenantID = L.Tenant2

Pero ambas consultas devolvieron el mismo apellido en dos columnas.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para obtener hasta 4 nombres únicos de la tabla Tenants, puedes utilizar subconsultas y la función COALESCE. COALESCE devuelve el primer valor no nulo, por lo que si un campo de Tenant está nulo, pasará al siguiente campo de Tenant hasta que encuentre un valor no nulo.

    Aquí está la consulta actualizada:

    SELECT L.LeaseID, I.Name as Type, L.StartDate, L.EndDate, 
           COALESCE(T1.FirstName + ' ' + T1.LastName, '') as Tenant1, 
           COALESCE(T2.FirstName + ' ' + T2.LastName, '') as Tenant2, 
           COALESCE(T3.FirstName + ' ' + T3.LastName, '') as Tenant3, 
           COALESCE(T4.FirstName + ' ' + T4.LastName, '') as Tenant4
    FROM Leases L 
    LEFT JOIN Intervals I ON I.Value = L.Interval 
    LEFT JOIN (
        SELECT TenantID, FirstName, LastName FROM Tenants
    ) T1 ON T1.TenantID = L.Tenant1
    LEFT JOIN (
        SELECT TenantID, FirstName, LastName FROM Tenants
    ) T2 ON T2.TenantID = L.Tenant2
    LEFT JOIN (
        SELECT TenantID, FirstName, LastName FROM Tenants
    ) T3 ON T3.TenantID = L.Tenant3
    LEFT JOIN (
        SELECT TenantID, FirstName, LastName FROM Tenants
    ) T4 ON T4.TenantID = L.Tenant4
    

    En esta consulta, estamos uniendo la tabla Tenants cuatro veces, una vez por cada campo de Tenant en la tabla Leases. Estamos utilizando subconsultas para seleccionar solo las columnas TenantID, FirstName y LastName de la tabla Tenants, para evitar confundir las uniones izquierdas al incluir columnas innecesarias.

    Luego, en la cláusula SELECT, utilizamos COALESCE para concatenar los nombres y apellidos de cada campo de Tenant en una sola columna, separados por un espacio. Si un campo está nulo, la función COALESCE devolverá una cadena vacía en su lugar.

    Con esta consulta, deberías obtener el conjunto de resultados deseado con hasta 4 nombres únicos en cada columna de Tenant.

Comments are closed.