none
Consulta SQL RRS feed

  • Pregunta

  • Buenas tardes a todos. 

    Les comento. Tengo esta consulta 

    select 
    	kd.hora,odometro_canbus, kms2
    FROM kilometraje_diario AS kd 
    	INNER JOIN vehiculos_cvu AS vc ON kd.patente = vc.patente  
    WHERE kd.patente = 'DSDG90' AND hora BETWEEN '2019-10-14 00:00:00' AND '2019-10-15 23:59:59' 
    GROUP BY  kd.kms2, kd.odometro_canbus, kd.hora 
    ORDER BY kd.hora desc

    que me trae estos datos

    ahora, lo que necesito es mostrar sólo un registro por día y que cumpla estas condiciones. Si hay odometro_canbus y kms2 entonces mostrar ambos. Si alguno de ellos es nulo, mostrar cero(0).

    entonces imagino que, al ser 1 por día la estructura debería ser así.

    hora                odometro_canbus    kms2
    2019-10-14 23:59:59 1331203285         1686
    2019-10-14 17:17:40 1331840455         0

    Cómo puedo lograr eso?? 

    espero su ayuda. Muchas gracias por todo. Saludos

    miércoles, 16 de octubre de 2019 18:29

Respuestas

  • Enrique, ¿podrías ejecutar el código de abajo y transcribir el resultado a esta conversación? Es para que yo pueda entender los datos.

    -- código #1
    SELECT vc.patente, kd.hora, kd.odometro_canbus, kd.kms2
      from vehiculos_cvu as vc
           left join kilometraje_diario as kd on kd.patente = vc.patente
      where (kd.patente is null 
             or kd.hora between '2019-10-14 00:00:00' and '2019-10-15 23:59:59')
            and kd.patente = 'DSDG90';


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    miércoles, 16 de octubre de 2019 19:43
  • Hola Enrique Aleman:

    Una posible solución.

    ;with cte as(
        select CAST(HORA AS DATE) AS ROW,
    	      kd.hora,
    		 ISNULL(odometro_canbus,0) AS odometro_canbus, 
    		 ISNULL(kms2,0) as kms2
        FROM kilometraje_diario AS kd 
    	   INNER JOIN vehiculos_cvu AS vc ON kd.patente = vc.patente  
        WHERE  
    	   kd.patente = 'DSDG90' AND
    	   hora BETWEEN '20191014 00:00' AND '20191015 23:59:59' 
        GROUP BY  kd.kms2, kd.odometro_canbus, kd.hora 
        )
    	   select	  min(hora) as hora
    			, max(odometro_canbus) as odometro_canbus
    			, max(kms2) as kms2
    	   from cte 
    	   group by row
    	   order by hora desc

    Metes tú consulta sin el order by en un cte. Y le añades un cast a la columna hora por dia (cast (hora as date))

    En la salida del cte, obtienes la menor fecha, el maximo de las otras dos columnas, pero agrupamos por esa row (cast as date).

    Salida

    Group by

    https://javifer2.blogspot.com/search/label/group%20by

    Espero te ayude

    miércoles, 16 de octubre de 2019 20:02

Todas las respuestas

  • Enrique, ¿podrías ejecutar el código de abajo y transcribir el resultado a esta conversación? Es para que yo pueda entender los datos.

    -- código #1
    SELECT vc.patente, kd.hora, kd.odometro_canbus, kd.kms2
      from vehiculos_cvu as vc
           left join kilometraje_diario as kd on kd.patente = vc.patente
      where (kd.patente is null 
             or kd.hora between '2019-10-14 00:00:00' and '2019-10-15 23:59:59')
            and kd.patente = 'DSDG90';


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    miércoles, 16 de octubre de 2019 19:43
  • patente hora odometro_canbus kms2
    DSDG90 2019-10-14 23:59:30.000 1331203285 NULL
    DSDG90 2019-10-15 17:17:40.000 1331840455 NULL
    DSDG90 2019-10-15 17:17:40.000 NULL 0
    DSDG90 2019-10-14 23:59:30.000 NULL 1656

    ese es el resultado, pero mira, lo resolví de la siguiente manera

      SELECT 
    	a.patente, 
    	MIN(a.kms2) AS km_gps_inicio, 
    	MAX(a.kms2) AS km_gps_termino,
    	MAX(a.kms2) AS km_actual_gps, 
    	CAST((MAX(a.odometro_canbus) / 1000) AS INT) AS km_actual_can,
    	CAST((MIN(a.odometro_canbus) / 1000) AS INT) AS km_can_inicio, 
    	CAST((MAX(a.odometro_canbus) / 1000) AS INT) AS km_can_termino, 
    	b.faena, 
    	(MAX(a.kms2) - MIN(a.kms2)) AS km_recorrido_gps,
    	CAST(((MAX(a.odometro_canbus) - MIN(a.odometro_canbus)) / 1000) AS INT) AS km_recorrido_can
      FROM kilometraje_Diario AS a, vehiculos_cvu AS b
      WHERE a.patente = 'dsdg90' AND a.hora BETWEEN '10-14-2019 00:00:00' AND '10-15-2019 23:59:59' AND a.patente = b.patente
      GROUP BY a.patente, b.faena
      UNION
      SELECT 
      a.patente, 
    	MIN(a.kms2) AS km_gps_inicio, 
    	MAX(a.kms2) AS km_gps_termino,
    	MAX(a.kms2) AS km_actual_gps, 
    	CAST((MAX(a.odometro_canbus) / 1000) AS INT) AS km_actual_can,
    	CAST((MIN(a.odometro_canbus) / 1000) AS INT) AS km_can_inicio, 
    	CAST((MAX(a.odometro_canbus) / 1000) AS INT) AS km_can_termino, 
    	b.faena, 
    	(MAX(a.kms2) - MIN(a.kms2)) AS km_recorrido_gps,
    	CAST(((MAX(a.odometro_canbus) - MIN(a.odometro_canbus)) / 1000) AS INT) AS km_recorrido_can
      FROM kilometraje_Diario AS a, vehiculos_cvu AS b
      WHERE a.patente = 'dsdg90'AND a.hora BETWEEN '10-14-2019 00:00:00' AND '10-15-2019 23:59:59' AND a.patente = b.patente
      GROUP BY a.patente, b.faena
    

    Muchas gracias.

    Saludos.

    miércoles, 16 de octubre de 2019 19:52
  • Hola Enrique Aleman:

    Una posible solución.

    ;with cte as(
        select CAST(HORA AS DATE) AS ROW,
    	      kd.hora,
    		 ISNULL(odometro_canbus,0) AS odometro_canbus, 
    		 ISNULL(kms2,0) as kms2
        FROM kilometraje_diario AS kd 
    	   INNER JOIN vehiculos_cvu AS vc ON kd.patente = vc.patente  
        WHERE  
    	   kd.patente = 'DSDG90' AND
    	   hora BETWEEN '20191014 00:00' AND '20191015 23:59:59' 
        GROUP BY  kd.kms2, kd.odometro_canbus, kd.hora 
        )
    	   select	  min(hora) as hora
    			, max(odometro_canbus) as odometro_canbus
    			, max(kms2) as kms2
    	   from cte 
    	   group by row
    	   order by hora desc

    Metes tú consulta sin el order by en un cte. Y le añades un cast a la columna hora por dia (cast (hora as date))

    En la salida del cte, obtienes la menor fecha, el maximo de las otras dos columnas, pero agrupamos por esa row (cast as date).

    Salida

    Group by

    https://javifer2.blogspot.com/search/label/group%20by

    Espero te ayude

    miércoles, 16 de octubre de 2019 20:02