locked
Unir dos consultas en SQL SERVER RRS feed

  • Pregunta

  • Hola a todos como estan, buenas tardes.

    me gustaria que me acompañen a hacer una consulta tengo los siguientes campos

    Primera Consulta esto es un ejemplo

    IdEquipo,Fecha, CantidadHoras

    segunda consulta

    IdEquipo, Fecha CantidadCombustible

    llegando a tener estos resultados por separados

    me gustaria que me den ideas de como hacer para unir estas dos consultas por favor los campos que tengo los tengo de campos en comun la fecha la tengo en formato dd/mm/aa (dia / mes / año)

    pero se que se puede convertir en mes y año para que en algun momento tenga que filtar por loor estos parametros

    rando de fechas

    01/10/2018

    31/10/2018

    O Mes

    Octubre

    Año

    2018

    Equipo 

    por favor ayudenme con ideas, haré la consulta con la sintaxi que me vayan proponiendo por favor les agradezco de antemano

    Roberto

    jueves, 21 de febrero de 2019 22:28

Respuestas

  • Hola Roberto:

    Mejor te expongo un ejemplo muy simple, porque además de darte la solución, para la próxima, ya lo tienes interiorizado.

    El objetivo es que no rompa, y para que no rompa, tenemos que tratar todas las posibilidades. Esta claro que en el dividendo, podemos controlar los null, porque podemos dividir cualquier número entre cualquier número.

    En el divisor es un poco diferente, porque tenemos que evitar los 0 para un desbordamiento.

    Pero claro, que hacemos con primera pregunta ¿Que valor tiene que mostrar 5/0....?

    DECLARE @table TABLE
    (id        INT IDENTITY(1, 1),
     dividendo DECIMAL(10, 2),
     divisor   DECIMAL(10, 2)
    );
    INSERT INTO @table
    (dividendo,
     divisor
    )
    VALUES
    (NULL,  5.25),
    (NULL,  NULL),
    (NULL,  0),
    (7,0),
    (0,  NULL),
    (0,  1),
    (12.23,  NULL),
    (12.27,  0),
    (15.23,  5.23);
    SELECT CAST(ISNULL(dividendo, 0) / CASE
                                           WHEN divisor = 0
                                           THEN null
                                           ELSE divisor
                                       END AS DECIMAL(10, 2)) AS resultado
    FROM @table;

    Solución 1:

    Mismos datos, para mismo ejemplo, otro modo (no trato el divisor.

    SELECT cast( dividendo / CASE
                                           WHEN divisor = 0
                                           THEN null
                                           ELSE divisor
                                       END AS DECIMAL(10, 2)) AS resultado
    FROM @table;

    Solución 2:

    Si quieres otra salida, que no sea null, puedes escoger en el case del divisor y adaptarlo a tus necesidades.

    Esperto te ayude

    • Propuesto como respuesta Pedro Alfaro lunes, 25 de febrero de 2019 15:38
    • Marcado como respuesta Roberto C. Melgar lunes, 25 de febrero de 2019 19:45
    domingo, 24 de febrero de 2019 19:34

Todas las respuestas

  • Hola Roberto C. Melgar.

    Una posible solución.

    create table PrimeraConsulta (idEquipo varchar(10), Mes date, CantidadHoras int)
    go
    Create table SegundaConsulta (idEquipo varchar(10), Mes date, CantidadHoras int)
    go
    insert into PrimeraConsulta (idEquipo, Mes, CantidadHoras)
    values
    ('A-001','20181001',150);
    insert into SegundaConsulta (idEquipo, Mes, CantidadHoras)
    values
    ('A-001','20181001',800)
    go
    

    Con tu escenario creado vamos a utilizar UNION ALL

    select 
    	idEquipo, DateName(Month,Mes) as Mes, CantidadHoras,0 as CantidadCombustible
    	from PrimeraConsulta
    union all
    Select 
    	idEquipo, DateName(Month,Mes), 0, CantidadHoras
    	from SegundaConsulta

    Esto nos da dos filas, ahora, solo quedaría juntarlas. (para esto hay muchas opciones. Vamos a utilizar group by)

    --Solución con tabla derivada	
    Select
    o.idEquipo, o.mes, sum(o.cantidadHoras) as cantidadHoras, sum(o.CantidadCombustible) as CantidadCombustible
     from
    (
    select 
    	idEquipo, DateName(Month,Mes) as Mes, CantidadHoras,0 as CantidadCombustible
    	from PrimeraConsulta
    union all
    Select 
    	idEquipo, DateName(Month,Mes), 0, CantidadHoras
    	from SegundaConsulta
    ) as o
    group by o.idEquipo, o.Mes

    Salida

    En cuanto a lo que comentas, como ves el escenario de las fechas, es muy interesante, no como Octubre o como 31/10....trabaja siempre que puedas con fechas, y en el retorno, escoge la manera de la que quieres que salgan. En este ejemplo por el nombre del mes.

    Un detalle, si puedes las fechas, siempre en formato yyyyMMdd, no importa el idioma, no importa la conexión (formato ISO), sino te puedes encontrar con problemas, ya que las fechas se almacenan en binario, pero a la hora de insertar o devolver los resultados dependen del idioma de la conexión.

    Datename

    https://docs.microsoft.com/es-es/sql/t-sql/functions/datename-transact-sql?view=sql-server-2017

    Union

    https://docs.microsoft.com/es-es/sql/t-sql/language-elements/set-operators-union-transact-sql?view=sql-server-2017

    Sum

    https://docs.microsoft.com/es-es/sql/t-sql/functions/sum-transact-sql?view=sql-server-2017

    • Propuesto como respuesta Pedro Alfaro viernes, 22 de febrero de 2019 0:01
    jueves, 21 de febrero de 2019 23:05
  • Puedes usar este ejemplo para que te funcione:

    SELECT OrderID, C.CustomerID, CompanyName, OrderDate
    FROM Customers C, Orders O
    WHERE C.CustomerID = O.CustomerID

    viernes, 22 de febrero de 2019 0:02
  • Gracias Javi pero una pregunta debo crear dos tablas para hacer luego las consultas? 

    siendo que esos datos ya los tengo en dos tablas actualmente.

    gracias por los comentarios

    viernes, 22 de febrero de 2019 14:50
  • Tu los tienes, pero yo no.

    Yo cree las dos tablas para emular tu escenario, y para que puedas ver, como se implementa.

    Por tanto tu coges tus dos tablas, y implementas la solución con tabla derivada.

    • Propuesto como respuesta Pedro Alfaro viernes, 22 de febrero de 2019 21:18
    viernes, 22 de febrero de 2019 15:07
  • Ha ok ok estaba pensando que debo crear dos tablas basadas en los datos que me arrogen las dos consultas, muchas gracias haré el código y lo mostrare para ver si esta bien o puedo optimizar.

    mucha gracias Javi.

    Roberto

    viernes, 22 de febrero de 2019 15:22
  • Estimado Javi aqui mi consulta por favor como debo unirlas ya que voy a ncesitar el idEquipo que esta en ambas tablas, y tambien el mes y tambien el año para cuando vaya aumentando y debo pensar que tendre mismo mes en año diferente

    SELECT        CodigoEquipo, HorasTrabajadas, FechaParte
    FROM            CabeceraLanzEquipos
    
    SELECT        DetalleSalidaCombustible.FechaBoleta, DetalleSalidaCombustible.Cantidad, DetalleSalidaCombustible.IdEquipo
    FROM            DetalleSalidaCombustible INNER JOIN
                             MaestroSalidaCombustible ON DetalleSalidaCombustible.IdMaestroSalidaCombustible = MaestroSalidaCombustible.IdMaestroSalidaCombustible

    cual seria la mejor solución

    gracias

    Roberto 

    viernes, 22 de febrero de 2019 16:13
  • Hola Roberto C. Melgar:

    Puede ser parecido a esto:

    SELECT DERIVADA.CODIGOEQUIPO AS IdEqupo, D.MESLETRA as Mes, SUM(D.HORASMES) as [Cantidad Horas], SUM(COMBUSTIBLE) as [Cantidad Combustible]
    FROM (
    	SELECT CodigoEquipo AS CODIGOEQUIPO,DATENAME(MONTH, FechaParte) AS MESLETRA, SUM(HorasTrabajadas) AS HORASMES, 0 AS COMBUSTIBLE
    		FROM            CabeceraLanzEquipos
    			GROUP BY CODIGOEQUIPO, DATENAME(MONTH,FECHAPARTE)
    	UNION ALL
    	SELECT       D.IdEquipo, D.FechaBoleta,0 ,SUM(D.Cantidad) AS COMBUSTIBLE
    		FROM            DetalleSalidaCombustible D 
    			GROUP BY D.IDEQUIPO, DATENAME(MONTH, D.FECHABOLETA
    	) AS DERIVADA
    GROUP BY DERIVADA.CODIGOEQUIPO, DERIVADA.MESLETRA

    Te he quitado la union de DetalleSalidaCombustible, con maestro, porque no la usas, por tanto no hace falta.

    Estoy partiendo de que quieres la salida como has puesto en el primer mensaje.

    • Propuesto como respuesta Pedro Alfaro viernes, 22 de febrero de 2019 21:18
    viernes, 22 de febrero de 2019 16:25
  • Estimado Javi me sale el siguiente error

    SELECT 
    DERIVADA.CODIGOEQUIPO AS IdEqupo, 
    DERIVADA.MESLETRA as Mes, 
    SUM(DERIVADA.HORASMES) as [Cantidad Horas], 
    SUM(COMBUSTIBLE) as [Cantidad Combustible]
    FROM (SELECT CodigoEquipo AS CODIGOEQUIPO,
    	DATENAME(MONTH, FechaParte) AS MESLETRA, 
    	SUM(HorasTrabajadas) AS HORASMES, 0 
    	AS COMBUSTIBLE
    		FROM 
    		CabeceraLanzEquipos
    		GROUP BY CODIGOEQUIPO, 
    		DATENAME(MONTH,FECHAPARTE)
    	UNION ALL
    	SELECT       D.IdEquipo, D.FechaBoleta,0 ,SUM(D.Cantidad) AS COMBUSTIBLE
    		FROM            DetalleSalidaCombustible D 
    			GROUP BY D.IDEQUIPO, DATENAME(MONTH, D.FECHABOLETA) )
    	AS DERIVADA
    GROUP BY DERIVADA.CODIGOEQUIPO, DERIVADA.MESLETRA
     

    Mens. 8120, Nivel 16, Estado 1, Línea 15
    La columna 'DetalleSalidaCombustible.FechaBoleta' de la lista de selección no es válida, porque no está contenida en una función de agregado ni en la cláusula GROUP BY.

    donde me queda el error por favor.

    gracias

    Roberto

    viernes, 22 de febrero de 2019 19:03
  • Si te fijas en el query en el segundo conjunto interior, nole puse Date(Month(FechaBoleta)) , pero si lo mencione en el group by.

    Cambialo en el select

    UNION ALL
    	SELECT       D.IdEquipo, DateName(Month,D.FechaBoleta),0 ,SUM(D.Cantidad) AS COMBUSTIBLE

    Es lo que tiene, cuando el que escribe es un poco torpón como yo. :)

    Pruebalo así y comentas, que te lo estoy contando al vuelo

    • Propuesto como respuesta Pedro Alfaro viernes, 22 de febrero de 2019 21:18
    viernes, 22 de febrero de 2019 19:17
  • Hola Roberto:

    El código es bastante mejorable, pero normalmente creo que la solución más óptima es la que por conocimientos, el interlocutor puede abarcar.

    Esta solución se basa en tres conjuntos simples, que deberías de analizar y entender

    Lo que hay, primer bloque, tienes que conprender el concepto del group by para las filas, que se solicitan.

    SELECT CodigoEquipo AS CODIGOEQUIPO,
    	DATENAME(MONTH, FechaParte) AS MESLETRA, 
    	SUM(HorasTrabajadas) AS HORASMES, 0 
    	AS COMBUSTIBLE
    		FROM 
    		CabeceraLanzEquipos
    		GROUP BY CODIGOEQUIPO, 
    		DATENAME(MONTH,FECHAPARTE)

    cuando tienes el primero, el segundo es igual.

    Luego te queda el union (este es super simple solo hay que leerlo).

    Y luego como se agrupa todo en la tabla derivada.

    SELECT 
    DERIVADA.CODIGOEQUIPO AS IdEqupo, 
    DERIVADA.MESLETRA as Mes, 
    SUM(DERIVADA.HORASMES) as [Cantidad Horas], 
    SUM(COMBUSTIBLE) as [Cantidad Combustible]
    FROM (
    ------ lo que corresopnda
    ------ que es la union de los dos conjuntos. Tambien ------ puedes poner mejor UNION ALL (INVESTIGALO)
    
    
    ) AS DERIVADA
    GROUP BY DERIVADA.CODIGOEQUIPO, DERIVADA.MESLETRA

    Este es el trabajo, entenderlo un poco, porque sino ....uff

    Suerte

    • Propuesto como respuesta Pedro Alfaro viernes, 22 de febrero de 2019 21:18
    viernes, 22 de febrero de 2019 19:24
  • Estimado Javi luego de analizar el codigo detenidamente lo llegue a comprenderlo, y quedó muy bien este es el codigo

    SELECT 
    DERIVADA.CODIGOEQUIPO AS IdEqupo, 
    DERIVADA.MESLETRA as Mes,
    DERIVADA.ANHIO, 
    SUM(DERIVADA.HORASMES) as [Cantidad Horas], 
    SUM(COMBUSTIBLE) as [Cantidad Combustible]
    FROM (SELECT CodigoEquipo AS CODIGOEQUIPO,DATENAME(MONTH, FechaParte) AS MESLETRA, DATENAME(YEAR, FechaParte) AS ANHIO,SUM(HorasTrabajadas) AS HORASMES, 0 AS COMBUSTIBLE FROM CabeceraLanzEquipos
    GROUP BY CODIGOEQUIPO, DATENAME(MONTH,FECHAPARTE),DATENAME(YEAR, FechaParte)
    UNION ALL

    SELECT D.IdEquipo, datename(MONTH,D.FechaBoleta) as MESLETRA,datename(YEAR,D.FechaBoleta) as ANHIO,0 as Horas ,SUM(D.Cantidad) AS COMBUSTIBLE FROM DetalleSalidaCombustible D 
    GROUP BY D.IDEQUIPO, DATENAME(MONTH, D.FECHABOLETA),datename(YEAR,D.FechaBoleta)
    ) AS DERIVADA
    GROUP BY DERIVADA.CODIGOEQUIPO, DERIVADA.MESLETRA,DERIVADA.ANHIO

    pero cuando agrego datename(YEAR,FechaBoleta) me aparece un null al inicio, que podría ser por favor una idea


    por favor, ya voy terminado esta parte y la verdad agradezco su colaboración.

    Roberto

    sábado, 23 de febrero de 2019 0:56
  • Hola Roberto C. Melgar:

    Genial.

    El null puede ser que tienes un null. Tienes algún registro huerfano. Que tiene asignada una hora, pero no tiene equipo.

    Si no lo quieres...where idEquipo is not null. O puedes tratarlo con la función isNULL y devolver un 0.

    Isnull

    https://javifer2.blogspot.com/2019/02/isnull-una-de-las-mas-usadas.html

    • Propuesto como respuesta Pedro Alfaro lunes, 25 de febrero de 2019 15:38
    sábado, 23 de febrero de 2019 5:24
  • Buen día Javi.

    Si la verdad es eso, hasta aquí y ahora todo bien, ahora para presentarlo esta claro que no debo presentar los IdEquipo y también debo mostrar si es Diésel, Gasolina u otros.

    lo intentare en caso de no poder pediré su ayuda.

    hasta aquí muchas gracias

    Roberto 

    sábado, 23 de febrero de 2019 13:10
  • Estimado Javi, mil disculpas por las molestia.

    tengo el y lo quise ordenar por año y numero de Mes porque la verdad tendré en algun momento mostrarlo ordenado por año y por mes. hice este codigo 

    Pero

    SELECT 
    DERIVADA.CODIGOEQUIPO AS IdEqupo, 
    DERIVADA.MESLETRA as Mes,
    DERIVADA.ANHIO, 
    DERIVADA.MESNUM,
    SUM(DERIVADA.HORASMES) as [Cantidad Horas], 
    SUM(COMBUSTIBLE) as [Cantidad Combustible]
    FROM (SELECT CodigoEquipo AS CODIGOEQUIPO,DATENAME(MONTH, FechaParte) AS MESLETRA, DATENAME(YEAR, FechaParte) AS ANHIO,DATEPART(MM,FechaParte) as MESNUM,SUM(HorasTrabajadas) AS HORASMES, 0 AS COMBUSTIBLE FROM CabeceraLanzEquipos
    			GROUP BY CODIGOEQUIPO, DATENAME(MONTH,FECHAPARTE),DATENAME(YEAR, FechaParte),DATEPART(MM,FechaParte) 
    	UNION ALL
    
    	SELECT D.IdEquipo, datename(MONTH,D.FechaBoleta) as MESLETRA,datename(YEAR,D.FechaBoleta) as ANHIO,0 as Horas ,DATEPART(MM,D.FechaBoleta) as MESNUM,SUM(D.Cantidad) AS COMBUSTIBLE FROM DetalleSalidaCombustible D 
    			GROUP BY D.IDEQUIPO, DATENAME(MONTH, D.FECHABOLETA),datename(YEAR,D.FechaBoleta),DATEPART(MM,D.FechaBoleta)
    	) AS DERIVADA
    GROUP BY DERIVADA.CODIGOEQUIPO, DERIVADA.MESLETRA,DERIVADA.ANHIO,DERIVADA.MESNUM
    order by anhio,MESNUM

    Me aparecen ceo en la Columna MESNUM

    Pero cuando ejecuto las consultas por bloque no me aparece ni un cero por favor que estoy haciendo mal

    gracias

    Roberto

    sábado, 23 de febrero de 2019 13:38
  • Estimado Javi la verdad mil disculpa en mi afan de no mostar los Id lo cambien un poco el codigo quedando de esta forma

    SELECT 
    DERIVADA.CODIGOEQUIPO AS IdEqupo, 
    DERIVADA.MESLETRA as Mes,
    DERIVADA.ANHIO, 
    DERIVADA.Prefijo,
    DERIVADA.NombreModelo,
    DERIVADA.NombreMarca,
    DERIVADA.NombreModelo,
    SUM(DERIVADA.HORASMES) as [Cantidad Horas], 
    SUM(COMBUSTIBLE) as [Cantidad Combustible]
    FROM(
    SELECT        CabeceraLanzEquipos.CodigoEquipo AS CODIGOEQUIPO, Equipos.Prefijo, TipoEquipo.NombreTipoEquipo,Marca.NombreMarca,   Modelo.NombreModelo,DATENAME(MONTH, CabeceraLanzEquipos.FechaParte) AS MESLETRA, DATENAME(YEAR, CabeceraLanzEquipos.FechaParte) AS ANHIO, 
                             SUM(CabeceraLanzEquipos.HorasTrabajadas) AS HORASMES, 0 AS COMBUSTIBLE
    FROM            CabeceraLanzEquipos 
    INNER JOIN
                             Equipos ON CabeceraLanzEquipos.CodigoEquipo = Equipos.IdEquipo INNER JOIN
                             Marca ON Equipos.IdMarca = Marca.IdMarca INNER JOIN
                             Modelo ON Equipos.IdModelo = Modelo.IdModelo INNER JOIN
                             TipoEquipo ON Equipos.IdTipoEquipo = TipoEquipo.IdTipoEquipo
    GROUP BY CabeceraLanzEquipos.CodigoEquipo, DATENAME(MONTH, CabeceraLanzEquipos.FechaParte), DATENAME(YEAR, CabeceraLanzEquipos.FechaParte), Equipos.Prefijo, TipoEquipo.NombreTipoEquipo, Marca.NombreMarca, 
                             Modelo.NombreModelo
    						 union all ----- nueva
    						 SELECT        Equipos.IdEquipo AS CODIGOEQUIPO, Equipos.Prefijo, TipoEquipo.NombreTipoEquipo, Marca.NombreMarca, Modelo.NombreModelo, DATENAME(MONTH,DetalleSalidaCombustible.FechaBoleta) AS MESLETRA, DATENAME(YEAR,DetalleSalidaCombustible.FechaBoleta) AS ANHIO ,SUM(DetalleSalidaCombustible.Cantidad) AS COMBUSTIBLE, 0 AS HORASMES
    FROM            DetalleSalidaCombustible  
    INNER JOIN
                             Equipos ON DetalleSalidaCombustible.IdEquipo = Equipos.IdEquipo INNER JOIN
                             Marca ON Equipos.IdMarca = Marca.IdMarca INNER JOIN
                             Modelo ON Equipos.IdModelo = Modelo.IdModelo INNER JOIN
                             TipoEquipo ON Equipos.IdTipoEquipo = TipoEquipo.IdTipoEquipo 
    						 GROUP BY
    						 Equipos.IdEquipo , Equipos.Prefijo, TipoEquipo.NombreTipoEquipo, Marca.NombreMarca, Modelo.NombreModelo, DATENAME(MONTH,DetalleSalidaCombustible.FechaBoleta),DATENAME(YEAR,DetalleSalidaCombustible.FechaBoleta)  ) as DERIVADA
    						 --where DERIVADA.CODIGOEQUIPO = 1
    						 GROUP BY DERIVADA.CODIGOEQUIPO, DERIVADA.MESLETRA,DERIVADA.ANHIO,DERIVADA.Prefijo,DERIVADA.NombreModelo,DERIVADA.NombreMarca,DERIVADA.NombreModelo

    pero ahora la forma quedo bien con los nombres correctos pero la cantidad Combustible me muestra solo ceros

    por favor creo que algo cambie y no consigo por mas que revise contra el anterior no consigo el resultado.

    agradeceré esta ayuda mas 

    Roberto 

    sábado, 23 de febrero de 2019 15:56
  • Hola Roberto:

    0 AS COMBUSTIBLE FROM CabeceraLanzEquipos
    0 AS HORASMES FROM DetalleSalidaCombustible

    Estas resolviendo para las dos consultas interiores, en la última consulta 0

    Union funciona del siguiente modo

    Select 'a' as literal1, 'b' as literal2
    union all
    Select 'c' as camisa, 'z' as pantalon

    El resultado es que la primera columna de los dos conjuntos, no importa que contenido tenga, saldrá con el alias de columna literal1. Y lo mismo con la columna2.

    Por tanto da igual que hayas sumado en un lado combustible y en otro horas, si devuelves los valores en la columna 10, van para el alias de columna 10 que hayas puesto en el primer conjunto.


    • Propuesto como respuesta Pedro Alfaro lunes, 25 de febrero de 2019 15:38
    domingo, 24 de febrero de 2019 6:11
  • Mira a ver si así te funciona

    SELECT DERIVADA.CODIGOEQUIPO AS IdEqupo, 
           DERIVADA.MESLETRA AS Mes, 
           DERIVADA.ANHIO, 
           DERIVADA.Prefijo, 
           DERIVADA.NombreModelo, 
           DERIVADA.NombreMarca, 
           DERIVADA.NombreModelo, 
           SUM(DERIVADA.HORASMES) AS [Cantidad Horas], 
           SUM(COMBUSTIBLE) AS [Cantidad Combustible]
    FROM
    (
        SELECT CabeceraLanzEquipos.CodigoEquipo AS CODIGOEQUIPO, 
               Equipos.Prefijo, 
               TipoEquipo.NombreTipoEquipo, 
               Marca.NombreMarca, 
               Modelo.NombreModelo, 
               DATENAME(MONTH, CabeceraLanzEquipos.FechaParte) AS MESLETRA, 
               DATENAME(YEAR, CabeceraLanzEquipos.FechaParte) AS ANHIO, 
               SUM(CabeceraLanzEquipos.HorasTrabajadas) AS HORASMES, 
               0 AS COMBUSTIBLE
        FROM CabeceraLanzEquipos
             INNER JOIN Equipos ON CabeceraLanzEquipos.CodigoEquipo = Equipos.IdEquipo
             INNER JOIN Marca ON Equipos.IdMarca = Marca.IdMarca
             INNER JOIN Modelo ON Equipos.IdModelo = Modelo.IdModelo
             INNER JOIN TipoEquipo ON Equipos.IdTipoEquipo = TipoEquipo.IdTipoEquipo
        GROUP BY CabeceraLanzEquipos.CodigoEquipo, 
                 DATENAME(MONTH, CabeceraLanzEquipos.FechaParte), 
                 DATENAME(YEAR, CabeceraLanzEquipos.FechaParte), 
                 Equipos.Prefijo, 
                 TipoEquipo.NombreTipoEquipo, 
                 Marca.NombreMarca, 
                 Modelo.NombreModelo
        UNION ALL ----- nueva
        SELECT Equipos.IdEquipo AS CODIGOEQUIPO, 
               Equipos.Prefijo, 
               TipoEquipo.NombreTipoEquipo, 
               Marca.NombreMarca, 
               Modelo.NombreModelo, 
               DATENAME(MONTH, DetalleSalidaCombustible.FechaBoleta) AS MESLETRA, 
               DATENAME(YEAR, DetalleSalidaCombustible.FechaBoleta) AS ANHIO, 
               0,
               SUM(DetalleSalidaCombustible.Cantidad) AS COMBUSTIBLE, 
        FROM DetalleSalidaCombustible
             INNER JOIN Equipos ON DetalleSalidaCombustible.IdEquipo = Equipos.IdEquipo
             INNER JOIN Marca ON Equipos.IdMarca = Marca.IdMarca
             INNER JOIN Modelo ON Equipos.IdModelo = Modelo.IdModelo
             INNER JOIN TipoEquipo ON Equipos.IdTipoEquipo = TipoEquipo.IdTipoEquipo
        GROUP BY Equipos.IdEquipo, 
                 Equipos.Prefijo, 
                 TipoEquipo.NombreTipoEquipo, 
                 Marca.NombreMarca, 
                 Modelo.NombreModelo, 
                 DATENAME(MONTH, DetalleSalidaCombustible.FechaBoleta), 
                 DATENAME(YEAR, DetalleSalidaCombustible.FechaBoleta)
    ) AS DERIVADA
    --where DERIVADA.CODIGOEQUIPO = 1
    GROUP BY DERIVADA.CODIGOEQUIPO, 
             DERIVADA.MESLETRA, 
             DERIVADA.ANHIO, 
             DERIVADA.Prefijo, 
             DERIVADA.NombreModelo, 
             DERIVADA.NombreMarca, 
             DERIVADA.NombreModelo;

    • Propuesto como respuesta Pedro Alfaro lunes, 25 de febrero de 2019 15:38
    domingo, 24 de febrero de 2019 6:19
  • Javi definitivamentes si así quedó mi codigo

    SELECT 
    DERIVADA.CODIGOEQUIPO AS IdEqupo, 
    DERIVADA.ANHIO AS AÑO, 
    DERIVADA.NUMEROMES AS NUMEROMES,
    DERIVADA.MESLETRA as MES,
    
    Equipos.Prefijo,
    TipoEquipo.NombreTipoEquipo,
    Marca.NombreMarca,
    Modelo.NombreModelo,
    Combustible.NombreCombustible,
    SUM(DERIVADA.HORASMES) as [Cantidad Horas], 
    SUM(COMBUSTIBLE) as [Cantidad Combustible],
    ISNULL((COMBUSTIBLE /  NULLIF(DERIVADA.HORASMES,0)),0) AS [Rendimiento]
    FROM (SELECT CodigoEquipo AS CODIGOEQUIPO,DATENAME(MONTH, FechaParte) AS MESLETRA, DATEPART(MM, FechaParte) AS NUMEROMES,DATENAME(YEAR, FechaParte) AS ANHIO,SUM(HorasTrabajadas) AS HORASMES, 0 AS COMBUSTIBLE FROM CabeceraLanzEquipos
    			GROUP BY CODIGOEQUIPO, DATENAME(MONTH,FECHAPARTE),DATENAME(YEAR, FechaParte),DATEPART(MM, FechaParte)
    	UNION ALL
    
    	SELECT D.IdEquipo, datename(MONTH,D.FechaBoleta) as MESLETRA,DATEPART(MM, D.FechaBoleta) AS NUMEROMES,datename(YEAR,D.FechaBoleta) as ANHIO,0 as Horas ,SUM(D.Cantidad) AS COMBUSTIBLE FROM DetalleSalidaCombustible D 
    			GROUP BY D.IDEQUIPO, DATENAME(MONTH, D.FECHABOLETA),datename(YEAR,D.FechaBoleta),DATEPART(MM, D.FechaBoleta)
    	) AS DERIVADA
    	INNER JOIN 
    	Equipos ON CODIGOEQUIPO = Equipos.IdEquipo
    	INNER JOIN
        Marca ON Equipos.IdMarca = Marca.IdMarca 
    	INNER JOIN
        Modelo ON Equipos.IdModelo = Modelo.IdModelo 
    	INNER JOIN
        TipoEquipo ON Equipos.IdTipoEquipo = TipoEquipo.IdTipoEquipo
    	INNER JOIN
        Combustible ON Equipos.IdCombustible = Combustible.IdCombustible
    	--where TipoEquipo.IdTipoEquipo = @IdTipoEquipo or @IdTipoEquipo is null
    GROUP BY DERIVADA.ANHIO,DERIVADA.NUMEROMES, DERIVADA.MESLETRA,Equipos.Prefijo,TipoEquipo.NombreTipoEquipo,Marca.NombreMarca,Modelo.NombreModelo,Combustible.NombreCombustible, DERIVADA.CODIGOEQUIPO

    ahora una columna mas la de redimiento o como le llamen quiero dividir el combustible entre las horas trabajadas, pero tengo columnas donde mi combustible es 0 y columnas donde las horas es 0 agregue una columna mas pero no me funciona 

    ISNULL((COMBUSTIBLE /  NULLIF(DERIVADA.HORASMES,0)),0) AS [Rendimiento]

    por favor como mas hago esto y creo que con eso ya termino de molestar por este tema.

    muchas gracias Javi

    Roberto

    domingo, 24 de febrero de 2019 15:56
  • Hola Roberto:

    Mejor te expongo un ejemplo muy simple, porque además de darte la solución, para la próxima, ya lo tienes interiorizado.

    El objetivo es que no rompa, y para que no rompa, tenemos que tratar todas las posibilidades. Esta claro que en el dividendo, podemos controlar los null, porque podemos dividir cualquier número entre cualquier número.

    En el divisor es un poco diferente, porque tenemos que evitar los 0 para un desbordamiento.

    Pero claro, que hacemos con primera pregunta ¿Que valor tiene que mostrar 5/0....?

    DECLARE @table TABLE
    (id        INT IDENTITY(1, 1),
     dividendo DECIMAL(10, 2),
     divisor   DECIMAL(10, 2)
    );
    INSERT INTO @table
    (dividendo,
     divisor
    )
    VALUES
    (NULL,  5.25),
    (NULL,  NULL),
    (NULL,  0),
    (7,0),
    (0,  NULL),
    (0,  1),
    (12.23,  NULL),
    (12.27,  0),
    (15.23,  5.23);
    SELECT CAST(ISNULL(dividendo, 0) / CASE
                                           WHEN divisor = 0
                                           THEN null
                                           ELSE divisor
                                       END AS DECIMAL(10, 2)) AS resultado
    FROM @table;

    Solución 1:

    Mismos datos, para mismo ejemplo, otro modo (no trato el divisor.

    SELECT cast( dividendo / CASE
                                           WHEN divisor = 0
                                           THEN null
                                           ELSE divisor
                                       END AS DECIMAL(10, 2)) AS resultado
    FROM @table;

    Solución 2:

    Si quieres otra salida, que no sea null, puedes escoger en el case del divisor y adaptarlo a tus necesidades.

    Esperto te ayude

    • Propuesto como respuesta Pedro Alfaro lunes, 25 de febrero de 2019 15:38
    • Marcado como respuesta Roberto C. Melgar lunes, 25 de febrero de 2019 19:45
    domingo, 24 de febrero de 2019 19:34
  • Estimado Javi muchas gracias la verdad la ultima parte no la pude implementar pero se que el algún momento lo realizare, de todas maneras quiero agradecerle por la molestia inclusive por constar en día domingo.

    pero hasta donde conseguí hacer con su ayuda quedo muy bien. 

    muya amable 

    Gracias

    Roberto 

    lunes, 25 de febrero de 2019 15:45