none
Obtener resultados por separado RRS feed

  • Pregunta

  • Hola a todos, hace unos días hice una pregunta:  https://social.msdn.microsoft.com/Forums/es-ES/8be0f069-7701-4ea5-bf47-fd32d923dad4/clausula-left-join?forum=sqlserveres

    Me la solucionaron, pero en mi pregunta tenia un error del que no me percate, si la leen veran que tenia que obtener resultado de varias tablas por separado. Ahora necesito agregar otra consulta en el mismo SP, pero no se como colocarlo. este es el codigo:

    AS
    BEGIN
    	SET NOCOUNT ON;
    	
    	WITH EgresosTrabajador AS
    (
        SELECT
    	p.Fecha_Creacion as [Fecha Creación Proyecto],
    	P.Descripcion_Proyecto as "Nombre Proyecto", 
    	P.Fecha_Inicio_Obra as "F. Ini. Obra", 
    	P.Fecha_Termino_Obra as "F. Ter. Obra", 
    	P.Status_Factura as "Status Factura", 
    	(T.Primer_Nombre +' '+ T.Apellido_Paterno +' '+ T.Apellido_Materno) AS "Jefe Proyecto",
    	P.Estado_Proyecto as "Estado Proyecto", 
    	P.Centro_Costo AS [Centro_Costo],
    	P.Rut_Cliente AS [Rut_Cliente],
    	isnull(MAX(t.Valor_Hora), 0) AS [valor_hora],
    
    	isnull(MAX(t.Valor_Hora_Extra), 0) AS [valor_hora_Extra],
    	isnull(MAX(P.Valor_Total), 0) AS [Valor Proyecto],
    	isnull(SUM(E.Monto), 0) AS [Logistica],	   
    	ISNULL((MAX(P.Valor_Total) * p.Administracion), 0) AS [Administración]
        
    	FROM 
    	   tbl_proyecto P
    	   LEFT JOIN Tbl_Trabajador T ON (P.Jefe_Proyecto = T.Rut)
    	   LEFT JOIN Tbl_Egresos E ON (P.Centro_Costo = E.Centro_Costo_Proyecto)
    	   LEFT JOIN Tbl_HH HH ON (hh.Rut_Trabajador = t.Rut)
    	   AND (E.Estado = 'Aprobado')
        
        GROUP BY
    	p.Fecha_Creacion, 
    	P.Descripcion_Proyecto, 
    	P.Fecha_Inicio_Obra, 
    	P.Fecha_Termino_Obra, 
    	P.Status_Factura, 
    	T.Primer_Nombre, 
    	T.Apellido_Paterno, 
    	T.Apellido_Materno, 
    	P.Estado_Proyecto, 
    	P.Centro_Costo, 
    	P.Rut_Cliente,
    	T.valor_hora,
    	T.Valor_Hora_Extra,
    	P.Valor_Total,
    	p.Administracion
    	   )
    
    	SELECT 
    	[Fecha Creación Proyecto],
    	C.Nombre as [Empresa],
    	[Nombre Proyecto],
    	[F. Ini. Obra],
    	[F. Ter. Obra], 
    	[Status Factura], 
    	[Jefe Proyecto],
    	[Estado Proyecto], 
    	isnull(MAX(E.[Valor Proyecto]), 0) AS [Valor Proyecto],
    	isnull(MAX(E.Logistica), 0) AS [Logistica],
    	(Isnull(SUM(H.Horas_Normales), 0) * Isnull(MAX(E.[valor_hora]), 0) + (isnull((SUM(H.Horas_Extras) * MAX(E.[valor_hora_Extra])),0))) AS [HH],
    	MAX(E.Administración) as [Administración],
    	(isnull(MAX(E.[Valor Proyecto]), 0) - isnull(MAX(E.Logistica), 0) - (Isnull(SUM(H.Horas_Normales), 0) * Isnull(MAX(E.[valor_hora]), 0) + (isnull((SUM(H.Horas_Extras) * MAX(E.[valor_hora_Extra])),0))) - MAX(E.Administración)) as [Utilidad]
    
    	from   EgresosTrabajador E
        LEFT JOIN Tbl_Cliente C ON (E.Rut_Cliente = C.Rut)
        LEFT JOIN tbl_hh H ON (E.centro_costo = H.centro_costo_proyecto)
    	
    		
    GROUP BY
        e.Centro_Costo, 
    	C.Nombre, 
    	[Nombre Proyecto],
    	[F. Ini. Obra],
    	[F. Ter. Obra], 
    	[Status Factura], 
    	[Jefe Proyecto],
    	[Estado Proyecto], [Fecha Creación Proyecto];
    End

    lo que nesecito es que el "valor_hora" y "valor_hora_extra", se obtenga de otro select pero en la misma consulta, puesto que me esta sacando el valor hora pero solo del jefe de proyecto y no de cada trabajador. en este caso seria algo como esto:

    AS
    BEGIN
    	SET NOCOUNT ON;
        SELECT
    	isnull(MAX(T.Valor_Hora), 0) AS [valor_hora],
    	isnull(MAX(T.Valor_Hora_Extra), 0) AS [valor_hora_Extra]
    	    
    	FROM 
    	   Tbl_Trabajador
    	   LEFT JOIN Tbl_HH H ON (T.Rut = H.Rut_Trabajador)
    	   
           GROUP BY
    	
    	T.valor_hora,
    	T.Valor_Hora_Extra
    probe con otro with pero me arroja un error, no se como insertarlo en la consulta.


    • Editado adriian.91 martes, 7 de marzo de 2017 13:02
    martes, 7 de marzo de 2017 12:58

Respuestas

  • . Lo que necesito es que en otra consulta se haga referencia a la Tbl_HH pero desde Trabajadores.
    . Lo que necesito es que en otra consulta se haga referencia a la Tbl_HH pero desde Trabajadores.
    . Lo que necesito es que en otra consulta se haga referencia a la Tbl_HH pero desde Trabajadores.

    Como respuesta rápida sin entrar en mucho detalle de la lógica de la consulta, te comento que si puedes crear varios "with" la sintaxis es tal que:


    AS BEGIN SET NOCOUNT ON; WITH EgresosTrabajador AS ( SELECT p.Fecha_Creacion as [Fecha Creación Proyecto], P.Descripcion_Proyecto as "Nombre Proyecto", P.Fecha_Inicio_Obra as "F. Ini. Obra", P.Fecha_Termino_Obra as "F. Ter. Obra", P.Status_Factura as "Status Factura", (T.Primer_Nombre +' '+ T.Apellido_Paterno +' '+ T.Apellido_Materno) AS "Jefe Proyecto", P.Estado_Proyecto as "Estado Proyecto", P.Centro_Costo AS [Centro_Costo], P.Rut_Cliente AS [Rut_Cliente], isnull(MAX(t.Valor_Hora), 0) AS [valor_hora], isnull(MAX(t.Valor_Hora_Extra), 0) AS [valor_hora_Extra], isnull(MAX(P.Valor_Total), 0) AS [Valor Proyecto], isnull(SUM(E.Monto), 0) AS [Logistica], ISNULL((MAX(P.Valor_Total) * p.Administracion), 0) AS [Administración] FROM tbl_proyecto P LEFT JOIN Tbl_Trabajador T ON (P.Jefe_Proyecto = T.Rut) LEFT JOIN Tbl_Egresos E ON (P.Centro_Costo = E.Centro_Costo_Proyecto) LEFT JOIN Tbl_HH HH ON (hh.Rut_Trabajador = t.Rut) AND (E.Estado = 'Aprobado') GROUP BY p.Fecha_Creacion, P.Descripcion_Proyecto, P.Fecha_Inicio_Obra, P.Fecha_Termino_Obra, P.Status_Factura, T.Primer_Nombre, T.Apellido_Paterno, T.Apellido_Materno, P.Estado_Proyecto, P.Centro_Costo, P.Rut_Cliente, T.valor_hora, T.Valor_Hora_Extra, P.Valor_Total, p.Administracion ),

    trabajadores AS (

    SELECT
        isnull(MAX(T.Valor_Hora), 0) AS [valor_hora],
        isnull(MAX(T.Valor_Hora_Extra), 0) AS [valor_hora_Extra]
            
        FROM
           Tbl_Trabajador
           LEFT JOIN Tbl_HH H ON (T.Rut = H.Rut_Trabajador)
           
           GROUP BY
        
        T.valor_hora,
        T.Valor_Hora_Extra

    ) SELECT [Fecha Creación Proyecto], C.Nombre as [Empresa], [Nombre Proyecto], [F. Ini. Obra], [F. Ter. Obra], [Status Factura], [Jefe Proyecto], [Estado Proyecto], isnull(MAX(E.[Valor Proyecto]), 0) AS [Valor Proyecto], isnull(MAX(E.Logistica), 0) AS [Logistica], (Isnull(SUM(H.Horas_Normales), 0) * Isnull(MAX(T.[valor_hora]), 0) + (isnull((SUM(H.Horas_Extras) * MAX(T.[valor_hora_Extra])),0))) AS [HH], MAX(E.Administración) as [Administración], (isnull(MAX(E.[Valor Proyecto]), 0) - isnull(MAX(T.Logistica), 0) - (Isnull(SUM(H.Horas_Normales), 0) * Isnull(MAX(T.[valor_hora]), 0) + (isnull((SUM(H.Horas_Extras) * MAX(T.[valor_hora_Extra])),0))) - MAX(E.Administración)) as [Utilidad] from EgresosTrabajador E LEFT JOIN Tbl_Cliente C ON (E.Rut_Cliente = C.Rut) LEFT JOIN tbl_hh H ON (E.centro_costo = H.centro_costo_proyecto)

    LEFT JOIN trabajadores T ON (E.IDENTIFICADOR = T.IDENTIFICADOR)

    GROUP BY e.Centro_Costo, C.Nombre, [Nombre Proyecto], [F. Ini. Obra], [F. Ter. Obra], [Status Factura], [Jefe Proyecto], [Estado Proyecto], [Fecha Creación Proyecto]; End

    Es decir, para añadir varios "with" no tienes que usar la palabra with varias veces, si no añadir una coma y as nombre ( sentencia )

    • Marcado como respuesta adriian.91 martes, 7 de marzo de 2017 15:41
    martes, 7 de marzo de 2017 15:34

Todas las respuestas

  • Pero... cuando estás haciendo la consulta :

    LEFT JOIN Tbl_Trabajador T ON (P.Jefe_Proyecto = T.Rut)

    Estás limitando a que te muestre el trabajador jefe de proyecto, es normal que solo te salga el valor_hora del jefe ya que estas obteniendo en la select el valor_hora del with:

    (Isnull(SUM(H.Horas_Normales), 0) * Isnull(MAX(E.[valor_hora]), 0) + (isnull((SUM(H.Horas_Extras) * MAX(E.[valor_hora_Extra])),0))) AS [HH],
    	

    Entiendo que si quieres que salga las horas de los trabajadores y no únicamente del jefe solo tendrías que cambiar la select para en vez de usar la tabla E (que es solo los jefes) usar la tabla general de trabajadores, la tabla C:

    (Isnull(SUM(H.Horas_Normales), 0) * Isnull(MAX(C.[valor_hora]), 0) + (isnull((SUM(H.Horas_Extras) * MAX(C.[valor_hora_Extra])),0))) AS [HH],
    	


    • Editado JavierIF martes, 7 de marzo de 2017 13:16
    martes, 7 de marzo de 2017 13:15
  • Hola Javier, gracias por tu respuesta... Pero te aclaro que la tabla C es de clientes (Empresas) y no de trabajadores. En la consulta se hace referencia a la tabla trabajadores (T) pero desde la tabla proyecto (P), para que pueda ver al "jefe de Proyecto"

    LEFT JOIN Tbl_Trabajador T ON (P.Jefe_Proyecto = T.Rut)

    Lo que necesito es que se haga referencia a la tabla trabajadores para saber el valor de sus horas. 

    isnull(MAX(T.Valor_Hora), 0) AS [valor_hora],
    	isnull(MAX(T.Valor_Hora_Extra), 0) AS [valor_hora_Extra]
    	    
    	FROM 
    	   Tbl_Trabajador
    	   LEFT JOIN Tbl_HH H ON (T.Rut = H.Rut_Trabajador)
    Pero no se si realmente se podra agregar esta otra consulta aqui.

    . Lo que necesito es que en otra consulta se haga referencia a la Tbl_HH pero desde Trabajadores.
    . Lo que necesito es que en otra consulta se haga referencia a la Tbl_HH pero desde Trabajadores.
    . Lo que necesito es que en otra consulta se haga referencia a la Tbl_HH pero desde Trabajadores.
    . Lo que necesito es que en otra consulta se haga referencia a la Tbl_HH pero desde Trabajadores.
    martes, 7 de marzo de 2017 13:25
  • . Lo que necesito es que en otra consulta se haga referencia a la Tbl_HH pero desde Trabajadores.
    . Lo que necesito es que en otra consulta se haga referencia a la Tbl_HH pero desde Trabajadores.
    . Lo que necesito es que en otra consulta se haga referencia a la Tbl_HH pero desde Trabajadores.

    Como respuesta rápida sin entrar en mucho detalle de la lógica de la consulta, te comento que si puedes crear varios "with" la sintaxis es tal que:


    AS BEGIN SET NOCOUNT ON; WITH EgresosTrabajador AS ( SELECT p.Fecha_Creacion as [Fecha Creación Proyecto], P.Descripcion_Proyecto as "Nombre Proyecto", P.Fecha_Inicio_Obra as "F. Ini. Obra", P.Fecha_Termino_Obra as "F. Ter. Obra", P.Status_Factura as "Status Factura", (T.Primer_Nombre +' '+ T.Apellido_Paterno +' '+ T.Apellido_Materno) AS "Jefe Proyecto", P.Estado_Proyecto as "Estado Proyecto", P.Centro_Costo AS [Centro_Costo], P.Rut_Cliente AS [Rut_Cliente], isnull(MAX(t.Valor_Hora), 0) AS [valor_hora], isnull(MAX(t.Valor_Hora_Extra), 0) AS [valor_hora_Extra], isnull(MAX(P.Valor_Total), 0) AS [Valor Proyecto], isnull(SUM(E.Monto), 0) AS [Logistica], ISNULL((MAX(P.Valor_Total) * p.Administracion), 0) AS [Administración] FROM tbl_proyecto P LEFT JOIN Tbl_Trabajador T ON (P.Jefe_Proyecto = T.Rut) LEFT JOIN Tbl_Egresos E ON (P.Centro_Costo = E.Centro_Costo_Proyecto) LEFT JOIN Tbl_HH HH ON (hh.Rut_Trabajador = t.Rut) AND (E.Estado = 'Aprobado') GROUP BY p.Fecha_Creacion, P.Descripcion_Proyecto, P.Fecha_Inicio_Obra, P.Fecha_Termino_Obra, P.Status_Factura, T.Primer_Nombre, T.Apellido_Paterno, T.Apellido_Materno, P.Estado_Proyecto, P.Centro_Costo, P.Rut_Cliente, T.valor_hora, T.Valor_Hora_Extra, P.Valor_Total, p.Administracion ),

    trabajadores AS (

    SELECT
        isnull(MAX(T.Valor_Hora), 0) AS [valor_hora],
        isnull(MAX(T.Valor_Hora_Extra), 0) AS [valor_hora_Extra]
            
        FROM
           Tbl_Trabajador
           LEFT JOIN Tbl_HH H ON (T.Rut = H.Rut_Trabajador)
           
           GROUP BY
        
        T.valor_hora,
        T.Valor_Hora_Extra

    ) SELECT [Fecha Creación Proyecto], C.Nombre as [Empresa], [Nombre Proyecto], [F. Ini. Obra], [F. Ter. Obra], [Status Factura], [Jefe Proyecto], [Estado Proyecto], isnull(MAX(E.[Valor Proyecto]), 0) AS [Valor Proyecto], isnull(MAX(E.Logistica), 0) AS [Logistica], (Isnull(SUM(H.Horas_Normales), 0) * Isnull(MAX(T.[valor_hora]), 0) + (isnull((SUM(H.Horas_Extras) * MAX(T.[valor_hora_Extra])),0))) AS [HH], MAX(E.Administración) as [Administración], (isnull(MAX(E.[Valor Proyecto]), 0) - isnull(MAX(T.Logistica), 0) - (Isnull(SUM(H.Horas_Normales), 0) * Isnull(MAX(T.[valor_hora]), 0) + (isnull((SUM(H.Horas_Extras) * MAX(T.[valor_hora_Extra])),0))) - MAX(E.Administración)) as [Utilidad] from EgresosTrabajador E LEFT JOIN Tbl_Cliente C ON (E.Rut_Cliente = C.Rut) LEFT JOIN tbl_hh H ON (E.centro_costo = H.centro_costo_proyecto)

    LEFT JOIN trabajadores T ON (E.IDENTIFICADOR = T.IDENTIFICADOR)

    GROUP BY e.Centro_Costo, C.Nombre, [Nombre Proyecto], [F. Ini. Obra], [F. Ter. Obra], [Status Factura], [Jefe Proyecto], [Estado Proyecto], [Fecha Creación Proyecto]; End

    Es decir, para añadir varios "with" no tienes que usar la palabra with varias veces, si no añadir una coma y as nombre ( sentencia )

    • Marcado como respuesta adriian.91 martes, 7 de marzo de 2017 15:41
    martes, 7 de marzo de 2017 15:34
  • Gracias Javier, esa era una de las dudas que tenia.
    martes, 7 de marzo de 2017 15:42