 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Dom 22 Jun, 2008 10:33 am Asunto: Contar ciertos registros de una consulta. |
|
|
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 |
|
 |
Touchsoftwares Master


Registrado: 16 Dic 2002Mensajes: 869Ubicación: MEXICO Playa del Carmen
|
Publicado: Dom 22 Jun, 2008 8:52 pm Asunto: |
|
|
| 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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 23 Jun, 2008 4:25 am Asunto: |
|
|
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. _________________
 |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 23 Jun, 2008 8:52 am Asunto: Re: Contar ciertos registros de una consulta. |
|
|
| 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 |
|
 |
kekal Ens


Registrado: 21 Jun 2005Mensajes: 37Ubicación: España
|
Publicado: Lun 23 Jun, 2008 5:13 pm Asunto: |
|
|
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 |
|
 |
kalux Master


Registrado: 21 Nov 2003Mensajes: 313Ubicación: Alicante - España
|
Publicado: Lun 23 Jun, 2008 6:06 pm Asunto: |
|
|
Hola,
Gracias a todos por contestar.
Es tal y como apunta Angel.
Tendre que hacer 2 consultas.
Gracias y un saludo. |
|
| Volver arriba |
|
 |
cecito Capt

Registrado: 25 Nov 2003Mensajes: 164Ubicación: Arequipa - Perú
|
Publicado: Mie 25 Jun, 2008 1:52 am Asunto: |
|
|
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  |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 25 Jun, 2008 7:36 am Asunto: |
|
|
| 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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 25 Jun, 2008 8:44 am Asunto: |
|
|
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 _________________
 |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Mie 25 Jun, 2008 7:14 pm Asunto: |
|
|
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 |
|
 |
kekal Ens


Registrado: 21 Jun 2005Mensajes: 37Ubicación: España
|
Publicado: Mie 25 Jun, 2008 11:29 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Jue 26 Jun, 2008 3:26 pm Asunto: |
|
|
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 |
|
 |
kekal Ens


Registrado: 21 Jun 2005Mensajes: 37Ubicación: España
|
Publicado: Jue 26 Jun, 2008 7:39 pm Asunto: |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 26 Jun, 2008 9:03 pm Asunto: |
|
|
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. _________________

Ultima edición por Cesar C. Salazar Gonzalez el Vie 27 Jun, 2008 1:49 am, editado 1 vez |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|