none
Error al calcular un promedio de reservas en SQL server 2012 RRS feed

  • Pregunta

  • Buenos dias! quiero sacar el promedio de asistencias a reservas en un restaurante, por lo cual quiero contabilizar el total de reservas del cliente, y de esas sacar el promedio de cuantas son completadas, pero me genera un error cerca del * que no se a que se pueda deber. Me lo genera cuando agrego el pedazo desde el * en adelante

    El Query:

    ((Select count(Reserva.id_reserva) from Reserva
    inner join cliente on cliente.id_cliente = reserva.id_cliente
     where Reserva.id_cliente=Cliente.id_cliente and Reserva.ID_EstadoReserva=4)*100/(Select count(Reserva.id_reserva) from Reserva)


    tomasgavagnin


    • Editado Orion1998 lunes, 18 de noviembre de 2019 18:29
    lunes, 18 de noviembre de 2019 18:27

Respuestas

Todas las respuestas

  • Me dice lo siguiente: Error de división entre cero.
    Advertencia: valor NULL eliminado por el agregado u otra operación SET.

    Por lo que entiendo cuando no encuentra registro y este es 0, genera un error de divicion por 0, hay forma de evitar eso?

    SELECT C.id_cliente, 
           count (R.id_reserva) as [Cantidad reserva],
           count (case when R.ID_EstadoReserva = 4 then R.id_reserva end) as [Cantidad reserva completada],
           (100.0 * count (case when R.ID_EstadoReserva = 4 then R.id_reserva end) / (count (R.id_reserva) +1)) as Promedio
      from CLIENTE as C 
           left join RESERVA as R on R.id_cliente = C.id_cliente
      group by C.id_cliente; 

    Sumandole 1 al promedio me lo evita pero no seria lo correcto.

    Igual La división debe ser por la cantidad de reservas que tiene un cliente, no todas las reservas, Si un cliente tiene 2 reservas finalizadas, si o si debe tener como minimo, 2 reservas hechas.


    tomasgavagnin



    • Editado Orion1998 lunes, 18 de noviembre de 2019 21:31
    lunes, 18 de noviembre de 2019 21:18
  • Hola tomasgavagnin:

    Para evitar una división entre cero puedes hacer un case

    SELECT C.id_cliente, 
           count (R.id_reserva) as [Cantidad reserva],
           count (case when R.ID_EstadoReserva = 4 then R.id_reserva end) as [Cantidad reserva completada],
           (100.0 * count (case when R.ID_EstadoReserva = 4 then R.id_reserva end) / 
    /* aquí cuando la expresión sea igual a 0 entonces 1 sino expresión y así evitas el error, y no modificas el valor */
     case when ((count (R.id_reserva) +1))=0 then 1 else (count (R.id_reserva) +1) end  as Promedio
      from CLIENTE as C 
           left join RESERVA as R on R.id_cliente = C.id_cliente
      group by C.id_cliente; 

    lunes, 18 de noviembre de 2019 22:09