none
Obtener los registros de dos campos de una misma tabla en una consulta RRS feed

  • Pregunta

  • Hola Comunidad! Muy buenas. Un placer saludarles y ser parte de esta maravillosa comunidad.

    Mi inquietud es para saber cómo puedo hacer una consulta que me muestre registros de dos campos diferentes de una misma tabla. Me explico.

    Tengo una tabla para registrar servicios a clientes. Los clientes son de dos tipos: externos e internos. Los internos son clientes propios de la empresa, los cuales tienen un registro con todos sus datos y en este caso se registra el código del cliente, y los externos no tienen un registro y se registra su nombre completo en el servicio. A continuación les pongo un ejemplo de las estructuras de las tablas:

    tablaServCli = sc (id int, idServicio int, EsInterno bit, idCliente int, ClienteExterno varchar(50), FechaServ DateTime)

    tablaClientes = c (id int, nombreCommpleto varchar(50), Direccion varchar(200),  dni(int), fechNac DateTime)

    tablaServicios = s (id int, servicio varchar(100))

    Necesito recuperar en una consulta los datos del servicio con el nombre del cliente interno, pero tambien los del cliente externo.

    Lo hago con una consulta UNION y ésta no recupera todos los registros y algunos salen nulos. Ejemplo:

    --Consulta para los clientes internos

    select sc.id as Codigo, s.Servicio, sc.FechaServ as Fecha, c.nombreCompleto as Cliente 

    from tablaServCli as sc

    inner join tablaClientes as c ON sc.idCliente = c.id

    inner join tablaServicios as s ON sc.idServicio = s.id

    where sc.FechaServ BETWEEN Convert(char(10), '2016-01-07',(105)) AND Convert(char(10), '2016-11-07',(105))

    UNION

    --Consulta para los clientes EXternos

    select sc.id as Codigo, s.Servicio, sc.FechaServ as Fecha, sc.ClienteExterno as Cliente 

    from tablaServCli as sc

    inner join tablaServicios as s ON sc.idServicio = s.id

    where sc.FechaServ BETWEEN Convert(char(10), '2016-01-07',(105)) AND Convert(char(10), '2016-11-07',(105))

    order by sc.FechaServ asc

    la Db está montada en un SQL Server 2005, pero utilizo el SQL Server Management Studio 2008.

    Les agradezco de antemano su valiosa ayuda. Un saludo


    Quien no conoce el pasado está condenado a repetirlo. Napoleón Bonaparte


    • Editado Paoli_vb martes, 12 de julio de 2016 19:25 aclaración
    martes, 12 de julio de 2016 19:23

Respuestas

  • Paoli_vb,

    Por lo que veo no requieres de utilizar el operador UNION te basta combinar con LEFT JOIN. Sugerencia adicional: trabaja con expresiones de fecha estándar, olvida esas conversiones "raras"

    SELECT 
    	sc.id AS Codigo,
    	s.Servicio, 
    	sc.FechaServ AS Fecha, 
    	ISNULL(c.nombreCompleto, sc.ClienteExterno) AS Cliente 
    FROM 
    	tablaServCli AS sc
    	INNER JOIN tablaServicios AS s ON (sc.idServicio = s.id)
    	LEFT JOIN tablaClientes AS c ON (sc.idCliente = c.id)	
    WHERE 
    	sc.FechaServ >= '20160701' AND sc.FechaServ < DATEADD(DAY, 1, '20160711')

    Espero que la información proporcionada te haya sido de utilidad.

    • Marcado como respuesta Paoli_vb jueves, 14 de julio de 2016 16:34
    martes, 12 de julio de 2016 20:12

Todas las respuestas

  • Incluso, si realizo la misma consulta en ambas partes de la union, este me recupera un registro menos. Por qué?

    Quien no conoce el pasado está condenado a repetirlo. Napoleón Bonaparte

    martes, 12 de julio de 2016 19:44
  • Paoli_vb,

    Por lo que veo no requieres de utilizar el operador UNION te basta combinar con LEFT JOIN. Sugerencia adicional: trabaja con expresiones de fecha estándar, olvida esas conversiones "raras"

    SELECT 
    	sc.id AS Codigo,
    	s.Servicio, 
    	sc.FechaServ AS Fecha, 
    	ISNULL(c.nombreCompleto, sc.ClienteExterno) AS Cliente 
    FROM 
    	tablaServCli AS sc
    	INNER JOIN tablaServicios AS s ON (sc.idServicio = s.id)
    	LEFT JOIN tablaClientes AS c ON (sc.idCliente = c.id)	
    WHERE 
    	sc.FechaServ >= '20160701' AND sc.FechaServ < DATEADD(DAY, 1, '20160711')

    Espero que la información proporcionada te haya sido de utilidad.

    • Marcado como respuesta Paoli_vb jueves, 14 de julio de 2016 16:34
    martes, 12 de julio de 2016 20:12
  • Hola Williams, buenas

    Gracias por la valiosa ayuda! He tenido los resultados esperados. Muchas Gracias!

    Podemos cerrar el Hilo.


    Quien no conoce el pasado está condenado a repetirlo. Napoleón Bonaparte

    jueves, 14 de julio de 2016 16:34