none
Consultar datos SQL RRS feed

  • Pregunta

  • Buenas, tengo una consulta.

    Tengo dos tablas: Tratamientos y Clientes.

    En la tabla Tratamientos se encuentra el idStatusTratamiento que puede tener 4 valores: 1-"Pendiente de Realizar", 2-"Realizado", 3-"Factura" y 4-"Cobrado".

    El Status que puede ser 1-"Activo", 2-"Baja" y 3-"Eventual"

    El TipoCliente que puede tomar 10 valores distintos.

    Y el idCliente que se conecta con el mismo campo de la tabla Clientes.

    Lo que necesito es tomar el idCliente y el nombre de los clientes que no tengan ningún idStatusTratamiento en 1 (que no haya tratamientos pendientes) y que los valores IdStatus y idTipoCliente se asignen según lo que elija el usuario en una ventana.

    Yo hice la siguiente consulta

    SELECT DISTINCT(C.idCliente) as ID_Cliente, C.Nombre  FROM Clientes C WHERE idStatus=@idStatus AND idTipoCliente=@idTipoCliente AND NOT EXISTS (SELECT NULL FROM Tratamientos T WHERE T.idCliente = C.idCliente) ORDER BY C.idCliente

    Pero hay algunos clientes que no me los muestra y debería mostrarlos.

    Espero sus respuestas y gracias :D


    Skull

    sábado, 23 de noviembre de 2019 14:04

Respuestas

  • Tal como lo tienes escrito, selecciona los clientes que no tienen ningún registro que les corresponda en la tabla de tratamientos. No has condicionado para nada que el idStatusTratamiento sea 1. Seguramente por eso no te devuelve todos los clientes que te tiene que devolver, porque estará omitiendo los que tienen idStatusTratamiento con otros valores.

    SELECT DISTINCT C.idCliente as ID_Cliente, C.Nombre
      FROM Clientes C
      WHERE idStatus=@idStatus
        AND idTipoCliente=@idTipoCliente
        AND NOT EXISTS (SELECT 1 FROM Tratamientos T WHERE T.idCliente = C.idCliente And T.idStatusTratamiento=1)
      ORDER BY C.idCliente
    

    Observa que te he quitado los paréntesis que había detrás del DISTINCT porque son engañosos. Dan la sensación de que el Distinct solo se aplica al C.idCliente cuando en realidad siempre afecta al conjunto de todas las columnas de la lista de selección.

    • Marcado como respuesta Skull15101996 sábado, 23 de noviembre de 2019 23:17
    sábado, 23 de noviembre de 2019 14:12

Todas las respuestas

  • Tal como lo tienes escrito, selecciona los clientes que no tienen ningún registro que les corresponda en la tabla de tratamientos. No has condicionado para nada que el idStatusTratamiento sea 1. Seguramente por eso no te devuelve todos los clientes que te tiene que devolver, porque estará omitiendo los que tienen idStatusTratamiento con otros valores.

    SELECT DISTINCT C.idCliente as ID_Cliente, C.Nombre
      FROM Clientes C
      WHERE idStatus=@idStatus
        AND idTipoCliente=@idTipoCliente
        AND NOT EXISTS (SELECT 1 FROM Tratamientos T WHERE T.idCliente = C.idCliente And T.idStatusTratamiento=1)
      ORDER BY C.idCliente
    

    Observa que te he quitado los paréntesis que había detrás del DISTINCT porque son engañosos. Dan la sensación de que el Distinct solo se aplica al C.idCliente cuando en realidad siempre afecta al conjunto de todas las columnas de la lista de selección.

    • Marcado como respuesta Skull15101996 sábado, 23 de noviembre de 2019 23:17
    sábado, 23 de noviembre de 2019 14:12
  • Gracias. Se me había hecho un lío porque pensé que tenía que mostrar menos datos jaja

    Skull

    sábado, 23 de noviembre de 2019 23:17