none
Sumatoria de columnas en un pivote RRS feed

  • Pregunta

  • Hola, tengo el siguiente procedimiento almacenado:

    SELECT
      IdConductor,
      Conductor,
      [2] AS Lunes,
      [3] AS Martes,
      [4] AS Miercoles,
      [5] AS Jueves,
      [6] AS Viernes,
      [7] AS Sabado 
    
    FROM (
      SELECT
        Planeacion.IdConductor AS IdConductor, 
        Conductores.Nombre AS Conductor,
        Rutas.Horas AS Horas,
        DATEPART(weekday, Planeacion.Fecha) AS DiaSemana 
      FROM Planeacion 
      INNER JOIN Conductores
         ON Planeacion.IdConductor = Conductores.IdConductor 
      INNER JOIN DetallePlaneacion
        ON Planeacion.IdConductor = DetallePlaneacion.IdConductor 
        AND Planeacion.Fecha = DetallePlaneacion.Fecha 
      INNER JOIN Rutas 
        ON DetallePlaneacion.IdRuta = Rutas.IdRuta  
    ) As SourceTable 
    
    PIVOT (
      SUM (Horas)
      FOR DiaSemana
      IN ([2], [3], [4], [5], [6], [7])
    ) AS PivotTable 
    
    ORDER BY Conductor 
    

         No se como hacer para sumar el contenido de las columnas de los dias de Lunes a Sabado para poder obtener un acumulado. Cualquier ayuda se los agradecere eternamente. Saludos

    martes, 14 de diciembre de 2010 3:24

Respuestas

  • Hola,

    Si no mal interpreto lo que quieres lograr, entiendo que es sumar el resultado de los días, por ejemplo si tienes los valores:

    Lunes: NULL
    Martes: 10
    Miercoles: 14
    Jueves: NULL

    Viernes: NULL
    Sabado: NULL

    Entonces quieres retornar esto:

    IdConductor    Conductor         Lunes    Martes    Miercoles    Jueves    Viernes    Sabado    Sumatoria
    1                    Willy Taveras    NULL      10          14              NULL       NULL       NULL        24


    Si es eso lo que quieres lograr, entonces prueba con esto:

    SELECT
     IdConductor,
     Conductor,
     [2] AS Lunes,
     [3] AS Martes,
     [4] AS Miercoles,
     [5] AS Jueves,
     [6] AS Viernes,
     [7] AS Sabado, 
     SUM(isNull([2],0) + isNull([3],0) + 
     isNull([4],0) + isNull([5],0) + 
     isNull([6],0) + isNull([7],0)) As Sumatoria
    FROM (
     SELECT
      Planeacion.IdConductor AS IdConductor, 
      Conductores.Nombre AS Conductor,
      Rutas.Horas AS Horas,
      DATEPART(weekday, Planeacion.Fecha) AS DiaSemana 
     FROM Planeacion
     INNER JOIN Conductores
       ON Planeacion.IdConductor = Conductores.IdConductor 
     INNER JOIN DetallePlaneacion
      ON Planeacion.IdConductor = DetallePlaneacion.IdConductor 
      AND Planeacion.Fecha = DetallePlaneacion.Fecha 
     INNER JOIN Rutas
      ON DetallePlaneacion.IdRuta = Rutas.IdRuta 
    ) As SourceTable 
    
    PIVOT (
     SUM(Horas)
     FOR DiaSemana
     IN ([2], [3], [4], [5], [6], [7])
    ) AS PivotTable 
    GROUP BY IdConductor, Conductor, [2],[3], [4], [5],[6], [7]
    ORDER BY Conductor
    
    


    Espero que te sirva.


    Willy Taveras.-

    http://itlearn.net

    • Marcado como respuesta abelsgmx martes, 14 de diciembre de 2010 18:30
    martes, 14 de diciembre de 2010 11:03
    Moderador

Todas las respuestas

  • Hola,

    Si no mal interpreto lo que quieres lograr, entiendo que es sumar el resultado de los días, por ejemplo si tienes los valores:

    Lunes: NULL
    Martes: 10
    Miercoles: 14
    Jueves: NULL

    Viernes: NULL
    Sabado: NULL

    Entonces quieres retornar esto:

    IdConductor    Conductor         Lunes    Martes    Miercoles    Jueves    Viernes    Sabado    Sumatoria
    1                    Willy Taveras    NULL      10          14              NULL       NULL       NULL        24


    Si es eso lo que quieres lograr, entonces prueba con esto:

    SELECT
     IdConductor,
     Conductor,
     [2] AS Lunes,
     [3] AS Martes,
     [4] AS Miercoles,
     [5] AS Jueves,
     [6] AS Viernes,
     [7] AS Sabado, 
     SUM(isNull([2],0) + isNull([3],0) + 
     isNull([4],0) + isNull([5],0) + 
     isNull([6],0) + isNull([7],0)) As Sumatoria
    FROM (
     SELECT
      Planeacion.IdConductor AS IdConductor, 
      Conductores.Nombre AS Conductor,
      Rutas.Horas AS Horas,
      DATEPART(weekday, Planeacion.Fecha) AS DiaSemana 
     FROM Planeacion
     INNER JOIN Conductores
       ON Planeacion.IdConductor = Conductores.IdConductor 
     INNER JOIN DetallePlaneacion
      ON Planeacion.IdConductor = DetallePlaneacion.IdConductor 
      AND Planeacion.Fecha = DetallePlaneacion.Fecha 
     INNER JOIN Rutas
      ON DetallePlaneacion.IdRuta = Rutas.IdRuta 
    ) As SourceTable 
    
    PIVOT (
     SUM(Horas)
     FOR DiaSemana
     IN ([2], [3], [4], [5], [6], [7])
    ) AS PivotTable 
    GROUP BY IdConductor, Conductor, [2],[3], [4], [5],[6], [7]
    ORDER BY Conductor
    
    


    Espero que te sirva.


    Willy Taveras.-

    http://itlearn.net

    • Marcado como respuesta abelsgmx martes, 14 de diciembre de 2010 18:30
    martes, 14 de diciembre de 2010 11:03
    Moderador
  • Otra forma de hacer lo que deseas

     

    SET DATEFIRST 7
    
    SELECT
    	IdConductor,
    	Conductor,
    	Lunes=Sum(Case When DiaSemana=2 Then Horas Else 0 End),
    	Martes=Sum(Case When DiaSemana=3 Then Horas Else 0 End),
    	Miercoles=Sum(Case When DiaSemana=4 Then Horas Else 0 End),
    	Jueves=Sum(Case When DiaSemana=5 Then Horas Else 0 End),
    	Viernes=Sum(Case When DiaSemana=6 Then Horas Else 0 End),
    	Sabado=Sum(Case When DiaSemana=7 Then Horas Else 0 End)
    From(
    	 SELECT
    	 Planeacion.IdConductor AS IdConductor, 
    	 Conductores.Nombre AS Conductor,
    	 Rutas.Horas AS Horas,
    	 DATEPART(weekday, Planeacion.Fecha) AS DiaSemana 
    	 FROM Planeacion
    	 INNER JOIN Conductores
    	  ON Planeacion.IdConductor = Conductores.IdConductor 
    	 INNER JOIN DetallePlaneacion
    	 ON Planeacion.IdConductor = DetallePlaneacion.IdConductor 
    	 AND Planeacion.Fecha = DetallePlaneacion.Fecha 
    	 INNER JOIN Rutas
    	 ON DetallePlaneacion.IdRuta = Rutas.IdRuta 
    	) As SourceTable 
    Group By IdConductor, Conductor
     
    

     

    martes, 14 de diciembre de 2010 14:31
  • Muchas gracias a ambos, en unos minutos voy a probar ambas opciones, les agradesco mucho su ayuda, que tengan un excelente dia.
    martes, 14 de diciembre de 2010 14:57