Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Contar ciertos registros de una consulta.
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Contar ciertos registros de una consulta. Responder citando

Hola,

Tengo una consulta que me devuelve unos datos. Ahora lo que quiero saber es cuantos de los registros de la consulta cumplen con cierta condicion.

Podria hacer una nueva consulta, aplicando todas las condiciones que me interesen y hacer un RecordCount, pero me ha surgido la curiosidad sobre si existe elgun metodo para realizar esta tarea.

Gracias y un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Código:

qry->Close();
qry->SQL->Add("SELECT * FROM tabla WHERE id=0");
qry->Open();
ShowMessage("hay "+IntToStr(qry->RecordCount)+" registros");

_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Dependiendo el tipo de motor de base de datos RecordCount puede regresar todos los registros (paradox) pero si es Interbase o Firebird solo regresa los registros mostrados en un componete, en el caso del TDBGrid, RecordCount regresa unicamente los registros mostrados (esto es solo en Firebird-Interbase), si se desea recuperar todos los registros que cumplen una consulta que no es de paradox y es de interbase - Firebird puede hacerse de la siguiente manera.

Código:
select count(*) as TotalRegistros from Pedidos

Esto puede estar contenido en un componente TSQL ya que la sentencia te sirve unica y exclusivamente para recuperar el Numero Total de Registros que tiene una consulta, aunado a ello puedes tambien usar la clausual "Where" para filtrar y "Group by" pues en algunos casos requiere de esta ultima sentencia.

Nota: TotalRegistros, se genera como un nuevo campo, asi que puedes usar FielByName para recuperar el valor.


Saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Re: Contar ciertos registros de una consulta. Responder citando

kalux escribió:
Podria hacer una nueva consulta, aplicando todas las condiciones que me interesen y hacer un RecordCount, pero me ha surgido la curiosidad sobre si existe elgun metodo para realizar esta tarea.

Las soluciones que te dan Gabriel y César son correctas, pero releyendo tu mensaje deduzco que quieres saber si puedo contar PARTE de los registros de una consulta; por ejemplo: saber cuantos hombres y mujeres hay en un censo SIN hace dos consultas independientes y me parece que no es posible.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola,

César, si me permites un apunte a la query que posteaste

select count(*) as TotalRegistros from Pedidos

si en vez de un select count(*) usas un

Select count(1) as totalRegistros from pedidos

usara menos memoria. aunque en BBDD pequeñas no se notara la diferencia, pero cuando sea con millones de registros y con subconsultas lo notaras.

Gracias y saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola,

Gracias a todos por contestar.

Es tal y como apunta Angel.
Tendre que hacer 2 consultas.

Gracias y un saludo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Creo que depende de como tienes guardados tus datos en la tabla. Por ejemplo para resolver la cantidad de hombres y mujeres en un censo y que este resultado salga en una sola fila podria hacerse así:
Código:
select
  sum( case when censo.Sexo = 'hombre' then 1 else 0 end ) as TotalHombres,
  sum( case when censo.sexo = 'mujer' then 1 else 0 end ) as TotalMujeres
from censo
where otras_condiciones

Para poder ayudarte deberías colocar la estructura de tu tabla con algunos datos de ejemplo y el resultado que esperas al realizar la consulta, así sería más fácil ayudarte Laughing
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

cecito escribió:
Código:
select
  sum( case when censo.Sexo = 'hombre' then 1 else 0 end ) as TotalHombres,
  sum( case when censo.sexo = 'mujer' then 1 else 0 end ) as TotalMujeres
from censo
where otras_condiciones

No conocía yo estas instrucciones en SQL (case, when, etc.) ¿Puede explicarme alguien cómo funcionan?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Estas sentencias las he encontrado en SQL-Firebird, el case, es como establecer un "if" dentro de las sentencias y When (cuando) pues es el condicionante

en el ejemplo de arriba, lo que hace es

"realizar una suma cuando el campo Sexo de la tabla censo 'sea' igual a hombre" se le suma 1 y si no es cero"

Cita:
sum( case when censo.Sexo = 'hombre' then 1 else 0 end ) as TotalHombres


el resultado muestralo como un "campo" de la tabla, aun que generalmente yo lo uso para generar campos calculados en la base de datos, asi dejo algunas operaciones que las realice el servidor y lo demas a al cliente.

por ejemplo en la declaracion de este campo lo uso
Código:
{...}
PORCTJ_IVA FLOAT,
    EXISTENCIA COMPUTED BY (CANTIDAD_EXISTENTE * 1),
    PRECIO_COMPRA_FACTURA FLOAT,
    PRECIO_VENTA_IVA_COSTEADO FLOAT,
    PRECIO_SIN_IVA COMPUTED BY ((PRECIO_VENTA_IVA_COSTEADO / (CASE WHEN (PORCTJ_IVA IS NULL OR PORCTJ_IVA=0) THEN 1 ELSE 1+(PORCTJ_IVA/100) END))));
);


en este proceso determino que se haga una multplicacion en la base de datos si el campo PORCTJ_IVA es igual a cero, le pongo 1 y si no que realice la operacion correcta con los valores.


Saludos
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias por la explicación César; desconocía estas instrucciones y en determinados casos pueden ser muy útiles, como bien dices.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Para Kekal:
Cita:

César, si me permites un apunte a la query que posteaste

select count(*) as TotalRegistros from Pedidos

si en vez de un select count(*) usas un

Select count(1) as totalRegistros from pedidos

usara menos memoria. aunque en BBDD pequeñas no se notara la diferencia, pero cuando sea con millones de registros y con subconsultas lo notaras.


No estoy muy de acuerdo con tu afirmación. He probado las siguientes sentencias:

Código:

1. -> select count(Tiquet) from Hist_tiquets_det;
2. -> select count(*) from Hist_tiquets_det;
3. -> select count(1) from Hist_tiquets_det;


Las he probado en la ventana de Analisis de Rendimiento del EMS y del IBConsole, obteniendo mucho mejores resultados con la primera sentencia.
Es decir si dentro del COUNT() pones el nombre de un Campo que no pueda ser NULO se emplean mucho menos recursos. Aunque las 3 sentencias tardan lo mismo ya que hay solo cerca de 6.000 registros, puedes comprobar que con las sentencias 2 y 3 se comprueban mas datos:
//**************************************************
(5 Tablas) Contra (1 Tabla)
Fetches: 12.124 contra Fetches: 12.065
Memory
------------------------------------------------
Current: 5.918.172 contra Current: 5.912.028

Tiempo Primera sentencia: 5.928 Registros = 16 milisegundos.
Tiempo Segunda sentencia: 5.928 Registros = 16 milisegundos.
Tiempo Tercera sentencia: 5.928 Registros = 16 milisegundos
//**************************************************


Por tanto si la tabla sobre la que haces la consulta tiene millones de registros, pues logicamente los diferentes resultados serán mayores.


Analisis de Rendimiento de PRIMERA SENTENCIA:

Query Time
------------------------------------------------
Prepare : 0
Execute : 16
Avg fetch time: 16,00 ms

Memory
------------------------------------------------
Current: 5.912.028
Max : 5.944.432
Buffers: 1.019

Operations
------------------------------------------------
Read : 0
Writes : 0
Fetches: 12.065

Plan:
------------------------------------------------
PLAN (HIST_TIQUETS_DET NATURAL)

Enchanced Info:
+--------------------------+-------+-----------+---------+---------+----------+
| Table Name | Index | Non-Index | Updated | Deleted | Inserted |
| | reads | reads | | | |
+--------------------------+-------+-----------+---------+---------+----------+
| HIST_TIQUETS_DET| 0 | 5.928 | 0 | 0 | 0 |
+--------------------------+-------+-----------+---------+---------+----------+


Analisis de Rendimiento de SEGUNDA Y TERCERA SENTENCIA:
Query Time
------------------------------------------------
Prepare : 0
Execute : 16
Avg fetch time: 16,00 ms

Memory
------------------------------------------------
Current: 5.918.172
Max : 5.944.432
Buffers: 1.019

Operations
------------------------------------------------
Read : 0
Writes : 0
Fetches: 12.124

Plan:
------------------------------------------------
PLAN (HIST_TIQUETS_DET NATURAL)

Enchanced Info:
+--------------------------+-------+-----------+---------+---------+----------+
| Table Name | Index | Non-Index | Updated | Deleted | Inserted |
| | reads | reads | | | |
+--------------------------+-------+-----------+---------+---------+----------+
| RDB$FIELDS| 6 | 0 | 0 | 0 | 0 |
| RDB$RELATION_FIELDS| 6 | 0 | 0 | 0 | 0 |
| RDB$RELATIONS| 2 | 0 | 0 | 0 | 0 |
| RDB$RELATION_CONSTRAINTS| 5 | 0 | 0 | 0 | 0 |
| HIST_TIQUETS_DET| 0 | 5.928 | 0 | 0 | 0 |
+--------------------------+-------+-----------+---------+---------+----------+
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.


Ultima edición por JesúsGandia el Jue 26 Jun, 2008 3:01 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Para JesúsGandia,

NO utilizo ni InterBase ni FireBird ni MySQL... uso Oracle 9/10g integrando con DB2 para as400 y si, veo perfectamente que si responde mejor. Incluso con el dialecto de SQL400 que tiene el OS de IBM. el hecho de cambiar el * por el 1 es para que no cree un registro de todo el registro, sino de un valor. he usado poco Interbase, la he usado un par de veces con el IBConsole para un par de programas en builder, desconozco como realizas la consulta si remotamente (directo a un server, via VPN) o en local. Solo te puedo decir que esto en Oracle va genial.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Para Kekal.

Tratandose de Interbase que es el motor que utilizo siempre la configuración minima que utilizo es remotamente via TCP/IP, aun cuando la Aplicación, el cliente y Servidor estan en el mismo PC. Tengo un mismo proyecto que conecta remotamente Internet via TCP/IP Dinamica. De echo Interbase recomienda hacer siempre las conexiones TCP/IP. Desconozco Oracle, pero si sé, que esta en la cima de los servidores de base de datos. Los únicos inconvenientes que le veo son por este Orden: Mantenimiento ( En Interbase puede ser NULO), Precio ( Firebird es gratis y casi 100% compatible con Interbase), no tiene eventos implementados, aunque quizas se puedan implementar con funciones externas (Interbase ya los lleva incorporado), Ignoro las plataformas donde puede ejecutarse Oracle (Interbase puede correr en UNIX, SOLARIS, LINUX, WINDOWS, NETWARE sin cambios en las base de Datos), Ignoro si Oracle aprovecha Multiprocesadores sin pagar un suplemento por ello(Interbase soporta multiprocesadores sin tener que pagar más, por lo menos la version nueva 2007)
Ante todo lo dicho, solo decir que Oracle es por lo que he leido uno de los mejores motores SQL y añadir que las pruebas las hice por simple curiosidad. Sin más, saludos.
P.D.
Por cierto en el COUNT(Tiquet) Tiquet es el nombre de un Campo que no acepta valores NULO. Por error de escritura dije que era una tabla(ya está corregido en el post)
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Para Jesus,

Me parece excelente tu conocimiento sobre Interbase, Oracle si es unos de los mejores, si soporta cluster, es multiplataforma y se integra herramientas y aplicaciones perfectamente, permite recuperacion de datos despues de un commit o rollback (no un backup) y backups en caliente. Tiene un mantenimiento como cualquier otra BBDD y foros donde puedes encontrar de todo. Es verdad que firebird e Iterbase es gratis, pero muchas herramientas de negocio como CRM/ERPs (Siebel, Sap, Vantive, Remedy, Meta4, SPSS..) o de de Reporting, mineria o ETLs (PowerCenter, Cognos, microstrategy, hyperion, BO, Builder Datawarehouse..) no soportan ni interbase ni firebird. De hecho no he encontrado empresas grandes con BBDD firebird/interbase.

Si, muchas de estas apliaciones se pagan por servidor y micro a veces.
Y a veces lo barato sale caro.
Entiendo que para una empresa es mejor implantar soluciones "cerradas" y modelarlas segun el tipo de negocio y necesidad que desarrollar un sistema completamente desde cero, el tiempo de desarrollo e implantacion contra el retorno de inversion. implantas antes, vendes antes, recuperas antes, puedes reinvertir.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

para Kekal: El objetivo de Firebird es la integración de un sistema robusto de bases de datos, no menosprecio a los demas sistemas, ni mucho menos trato de hacer alguna comparación entre ellos.

Cada uno de los sistemas integrados con diferentes Administradores donde se vea inmerso SQL <-- el lenguaje, permiten el manejo de procedures, triggers, backups, restores etc etc.

Yo uso Firebird, pues a ultimas fechas, he visto entre todos los administradores de Bases de datos, el que mas satisfacciones me ha dado, es multiplataforma al igual que interbase y Oracle, es soportado por los mismos sistemas operativos, la frase de "Lo barato sale caro", es correcto, pero tambien existe otra "Tanto alumbra la vela, que el santo se quema".

Considero que aqui no hay competencias de cual es mejor o cual es el peor, más bien es el sistema que Cumple tus necesidades, si tu consideras que pagar oracle te resuelve los problemas es correcto, si a Jesús considera que resolver los problemas con Interbase pues tambien es correcto, si a mi FireBird, me resuelve los problemas, es correcto tambien.

pero creo que se esta perdiendo la esencia, los 3 usan SQL como lenguaje de datos para realizar sus operaciones. el que uno lo haga mas rápido o mas lento, no depende del uso de la sentencia (en algunos casos si), depende mucho de un buen modelado de base de datos.

para terminar e indicarte existe una página de nombre EMS, la cual brinda soporte para los "mejores" administradores de Bases de datos, entre ellos SQL Server y Oracle, como tambien Interbase y Firebird, asi mismo puedo asegurar que muchos del foro usamos este software.

Este software es "casi" un Estandar para nosotros los desarrolladores, pues a parte de los programas de modelaje que indicas, este software permite el modelado y la Ingenieria inversa de las Bases de datos.

pues solo fué eso, una simple opinion mia con respecto al comentario de Kekal.
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Vie 27 Jun, 2008 1:49 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.