Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-01-2008
zvf zvf is offline
Miembro
 
Registrado: abr 2006
Posts: 158
Poder: 19
zvf Va por buen camino
Sintaxis con count

¡Hola a todos!

Tengo una duda, tengo la siguiente consulta:

Código SQL [-]
select cita_pacienteid, cuenta= count(cita_id)
from cita
where cita_status = 'I'

Estoy buscando pacientes con estatus de la cita = I, pero lo que quiero hacer es que solo me muestre los niños que en la columna "cuenta" tengan 1 inasistencia y no se como hacerlo, porque lo intente asi:

Código SQL [-]
select cita_pacienteid, cuenta= count(cita_id)
from cita
where cita_status = 'I' and cuenta < 2

Pero me dice que no encuentra la columna cuenta.
¿Como lo puedo hacer?

Gracias de antemano por su ayuda.
Responder Con Cita
  #2  
Antiguo 30-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Y no es asi:
Código SQL [-]
select cita_pacienteid, count(cita_id) AS Cuenta
from cita
where cita_status = 'I'
Saludos
Responder Con Cita
  #3  
Antiguo 30-01-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 23
ContraVeneno Va por buen camino
Código SQL [-]
select cita_pacienteid, cuenta= count(cita_id)
from cita
where cita_status = 'I' and count(cita_id)< 2
__________________

Responder Con Cita
  #4  
Antiguo 30-01-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
Yo voto por esta:

Código SQL [-]
select cita_pacienteid, count(cita_pacienteid)
from cita
where cita_status = 'I'
group by cita_pacienteid
having count(cita_pacienteid) = 1

Bye
Responder Con Cita
  #5  
Antiguo 30-01-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Pues yo me quedo con la simpleza de caral y contra:

Código SQL [-]
select cita_pacienteid, count(cita_id) as cuenta
from  cita
where  cita_status = 'I' and count(cita_id) < 2

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 30-01-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
No sé si en algunos motores sea válido, pero hasta donde sé, no puede usarse count con un campo si ese campo no está en la cláusula group by. Por otra parte, las condiciones sobre campos agregados, en principio se hacen con having y no con where.

Bye
Responder Con Cita
  #7  
Antiguo 30-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Cita:
Empezado por keyboy Ver Mensaje
No sé si en algunos motores sea válido, pero hasta donde sé, no puede usarse count con un campo si ese campo no está en la cláusula group by. Por otra parte, las condiciones sobre campos agregados, en principio se hacen con having y no con where.

Bye
Coincido con Keyboy en que no se puede hacer sin un Group By por seu un campo agregado, en el caso del Where, este SI se puede usar, simplemente colocandolo antes de la clausula Group, en el caso de Having seria despues de esta clausula, en si hacen el mismo efecto.
Saludos
Responder Con Cita
  #8  
Antiguo 30-01-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
No es que no pueda usarse where junto con having; en el ejemplo que puse, están ambos. Pero el resultado de una función agregada como count, no puede saberse sino hasta que se han seleccionado todos los registros que satisfagan la cláusula where; por ello, es que existe having, para poder poner condiciones sobre los resultados del agrupamiento.

Bye
Responder Con Cita
  #9  
Antiguo 30-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No te enojes con este novato, pero no hace falta poner el having si ya pusiste el where, no hace falta repetir lo mismo, o casi, en la sentencia where se puede completar todo.
Que lo he hecho así que lo digo con convicción.
Saludos
Responder Con Cita
  #10  
Antiguo 30-01-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
No sé. Quizá algunos motores lo permitan. Yo acabo de probar con MySQL y no se puede. El punto es el timing. where y having no ocurren al mismo tiempo. El motor, primero hace la selección de registros de acuerdo a lo que contenga el where y luego agrupa los registros. No puede saber cuántos hay de cada elemento del grupo, si todavía no hace el agrupamiento. Una vez hecho el agrupamiento, el where ya pasó, ya no es su tiempo. Por eso viene el having.

Quizá algunos motores puedan discernir que un count colocado en el where debe "apartarse" y aplicarse luego del agrupamiento, pero no creo que sea el estándar.

Bye
Responder Con Cita
  #11  
Antiguo 30-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Bueno, en la discusión sana que tenemos, ademas de que estoy aprendiendo un montón, te puedo decir que en Access y Firebird que son los que tengo a mano, funciona.
No he probado MySql, no lo tengo instalado, pero creo en tu palabra, así que ni lo instalo.
Saludos
Responder Con Cita
  #12  
Antiguo 30-01-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
Pues no sé qué decir. Acabo de probar con Access y me manda este error:

Cita:
No puede haber una función de agregado en la cláusula WHERE


Bye
Responder Con Cita
  #13  
Antiguo 30-01-2008
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
MySQL si permite hacer el count sin indicar ningun group lo cual es muy válido dado que muchas veces (como esta) no necesitamos agrupar. El BDE no permite esto y obliga a poner el group con todos los campos.
Código SQL [-]
select cita_pacienteid, count(*) as cuenta
from cita
where cita_status = 'I' and count(*) < 2


Esta sentencia es totalmente válida en MySQL. "Count(*) Devuelve un contador de las filas recuperadas".
__________________
AKA "El animalito" ||Cordobés a mucha honra||

Última edición por AzidRain fecha: 30-01-2008 a las 21:51:43.
Responder Con Cita
  #14  
Antiguo 30-01-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
Eso es cierto, puede usarse un función agregada sin group by en los casos en los que realmente no se necesita agrupar. Pero, a mi entender, este caso sí requiere agrupación: se tiene una lista de pacientes, cada uno puede tener varias inasistencias. Entonces agrupa por paciente para saber cuántas inasistencias tiene cada uno.

Bye
Responder Con Cita
  #15  
Antiguo 30-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
La sentencia en SQL estándar que devuelve esta información es:

Código SQL [-]
select cita_pacienteid, count(cita_pacienteid)
  from cita
 where cita_status = 'I'
 group by cita_pacienteid
having count(cita_pacienteid) = 1

Puede que motores como mysql o access acepten otras sintaxis... ya ves que los dialectos SQL de estos motores son bastante torcidos. Pero una sentencia como la mostrada, correrá prácticamente en cualquier motor decente.

Hasta luego

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #16  
Antiguo 31-01-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Gracias por aclarar la situación. Es cierto, para el count es necesario el agrupamiento. No se en que tenía la cabeza en ese momento.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #17  
Antiguo 31-01-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
Cita:
Empezado por jachguate Ver Mensaje
La sentencia en SQL estándar que devuelve esta información es:

Código SQL [-]
select cita_pacienteid, count(cita_pacienteid)
  from cita
 where cita_status = 'I'
 group by cita_pacienteid
having count(cita_pacienteid) = 1
¿No es lo que yo decía?

Bye
Responder Con Cita
  #18  
Antiguo 31-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por keyboy Ver Mensaje
¿No es lo que yo decía?

Bye
jo jo jo... claro que si!!

Lo siento, pasé por alto tu respuesta... exactamente eso keyboy.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
SQL y clausula Count karlaoax SQL 14 17-09-2007 19:35:55
RecordCount Vs Count (SQL) vtdeleon Conexión con bases de datos 8 10-10-2005 08:10:28
varios count pepe2000 SQL 7 16-02-2005 18:16:51
sentencia count()..... hook SQL 8 04-05-2004 14:53:04
Resultado de Count en SQL MRang14 SQL 2 05-03-2004 19:42:47


La franja horaria es GMT +2. Ahora son las 15:27:57.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi