Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Sintaxis con count (https://www.clubdelphi.com/foros/showthread.php?t=52775)

zvf 30-01-2008 19:45:08

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.
:confused: ¿Como lo puedo hacer?

Gracias de antemano por su ayuda.

Caral 30-01-2008 19:47:32

Hola
Y no es asi:
Código SQL [-]
select cita_pacienteid, count(cita_id) AS Cuenta
from cita
where cita_status = 'I'
Saludos

ContraVeneno 30-01-2008 20:00:29

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

keyboy 30-01-2008 20:07:23

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

Delphius 30-01-2008 20:19:00

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,

keyboy 30-01-2008 20:38:21

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

Caral 30-01-2008 20:53:54

Hola
Cita:

Empezado por keyboy (Mensaje 262212)
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

keyboy 30-01-2008 21:08:15

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

Caral 30-01-2008 21:13:46

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.:D:D
Saludos

keyboy 30-01-2008 21:21:17

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

Caral 30-01-2008 21:26:03

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.:D
Saludos

keyboy 30-01-2008 21:34:50

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
:confused:

Bye

AzidRain 30-01-2008 21:36:18

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".

keyboy 30-01-2008 21:43:33

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

jachguate 30-01-2008 22:02:12

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

;)

Delphius 31-01-2008 00:20:50

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.:o

Saludos,

keyboy 31-01-2008 00:30:51

Cita:

Empezado por jachguate (Mensaje 262258)
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

jachguate 31-01-2008 01:02:18

Cita:

Empezado por keyboy (Mensaje 262288)
¿No es lo que yo decía?

Bye

jo jo jo... claro que si!! :eek::eek:

Lo siento, pasé por alto tu respuesta... exactamente eso keyboy.


La franja horaria es GMT +2. Ahora son las 14:37:31.

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