es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cuando estoy realizando esta consulta, obtengo valores NULL. ¿Por qué?

Tengo una tabla llamada fact_trip que tiene una columna llamada fare_final y quiero encontrar la diferencia entre los valores.

SQL> desc fact_trip
Nombre                                      ¿Nulo?    Tipo
----------------------------------------- -------- ----------------------------
TRIP_UUID                                 NOT NULL VARCHAR2(20)
DATESTR                                            DATE
PRODUCT_TYPE_NAME                                  VARCHAR2(20)
CITY_ID                                            NUMBER
DRIVER_UUID                                        VARCHAR2(50)
IS_COMPLETED                                       VARCHAR2(10)
ETA                                                NUMBER
ATA                                                NUMBER
UFP_FARE                                           NUMBER(4,2)
FARE_FINAL                                         NUMBER(4,2)

Así que cuando hago esto, obtengo NULL como resultado:

SQL>  select sum(fare_final) from fact_trip where to_char(datestr, 'W')=1 - (select sum(fare_final) from fact_trip where to_char(datestr, 'W')=2);

SUM(FARE_FINAL)
---------------

Incluso intenté hacer esas consultas select individualmente de esta manera:

SQL> select sum(fare_final) from fact_trip where to_char(datestr, 'W')=1;

SUM(FARE_FINAL)
---------------
         1821.6

SQL> select sum(fare_final) from fact_trip where to_char(datestr, 'W')=2;

SUM(FARE_FINAL)
---------------
         67

Lo cual, por supuesto, obtiene un resultado. Pero luego, cuando ejecuto esas consultas para obtener la diferencia entre ellas, muestra NULL. Como quiero la diferencia entre ellas (1821.6 - 67).
¿Alguien puede decirme qué está mal en eso?
¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que causa la salida NULL puede ser debido a la resta de dos valores que pueden resultar en null si el segundo valor es mayor que el primer valor. Para evitar este problema, puedes usar una declaración case para comprobar los valores null y luego devolver un 0 para ese valor. Aquí tienes una consulta actualizada que debería funcionar:

    SELECT 
      CASE 
        WHEN (SELECT SUM(fare_final) FROM fact_trip WHERE TO_CHAR(datestr, 'W') = 2) IS NOT NULL 
          THEN (SELECT SUM(fare_final) FROM fact_trip WHERE TO_CHAR(datestr, 'W') = 1) - (SELECT SUM(fare_final) FROM fact_trip WHERE TO_CHAR(datestr, 'W') = 2)
        ELSE (SELECT SUM(fare_final) FROM fact_trip WHERE TO_CHAR(datestr, 'W') = 1)
      END as fare_difference
    FROM dual;
    

    Esta consulta comprobará si la suma de la segunda semana es null y, si lo es, simplemente devolverá la suma de la primera semana. Si no es null, entonces restará la suma de la segunda semana de la suma de la primera semana.

Comments are closed.