Access 2007. Selección de valores máximos
Puede que el encabezado no sea buen descriptor de mi problema.
Partiendo de que tengo una tabla con los siguientes datos:
Especie número de ejemplares ambiente
Gaviota 12 A
Gaviota 5 B
Gaviota 3 C
Lirón 15 A
Lirón 12 C
Gineta 5 A
Gineta 10 C
Quiero obtener en una consulta el hábitat más común para cada animal. Es decir, cuál es el ambiente donde es más frecuente observar a la gaviota (máximo número de ejemplares), cuál es el ambiente donde es más frecuente encontrar al lirón, a la gineta, etc.
Partiendo de que tengo una tabla con los siguientes datos:
Especie número de ejemplares ambiente
Gaviota 12 A
Gaviota 5 B
Gaviota 3 C
Lirón 15 A
Lirón 12 C
Gineta 5 A
Gineta 10 C
Quiero obtener en una consulta el hábitat más común para cada animal. Es decir, cuál es el ambiente donde es más frecuente observar a la gaviota (máximo número de ejemplares), cuál es el ambiente donde es más frecuente encontrar al lirón, a la gineta, etc.
1 respuesta
Respuesta de josecmf
1
1
josecmf, Access. Monopuesto y multipuesto. Más de 13 años de experiencia
Haz una consulta sobre esa table, en la que además de los campos que muestras en tu pregunta, creas un campo que se llame, MaxEspecie, utilizando la función DMax, en tu caso:
MaxEspecie: DMax ("[Numero de ejemplares]";"nombretabla";"Especie='" & Especie & "'")
Verás al ejecutarla que aparece el valor numérico máximo.
Una vez que la tengas, crea otro campo que se llame, EsMaximo y con esta pinta:
EsMaximo: SiInm([Numero de ejemplares] = MaxEspecie; True; False)
Ese campo te dice si coinciden los valores numéricos.
Para ver los hábitos donde se cumple eso, ponle la condición True y ya está.
MaxEspecie: DMax ("[Numero de ejemplares]";"nombretabla";"Especie='" & Especie & "'")
Verás al ejecutarla que aparece el valor numérico máximo.
Una vez que la tengas, crea otro campo que se llame, EsMaximo y con esta pinta:
EsMaximo: SiInm([Numero de ejemplares] = MaxEspecie; True; False)
Ese campo te dice si coinciden los valores numéricos.
Para ver los hábitos donde se cumple eso, ponle la condición True y ya está.
Ante todo, muchísimas gracias por la respuesta...
Si aplico las expresiones que me dices, creando una consulta a partir de la tabla que puse de ejemplo, me sale redondo. Hasta ahí, perfecto.
Pero, mi situación es ligeramente diferente ya que no la describí bien.
Lo que llamé tabla:
Especie número de ejemplares ambiente
Gaviota 12 A
Gaviota 5 B
Gaviota 3 C
Lirón 15 A
Lirón 12 C
Gineta 5 A
Gineta 10 C
, es en realidad una Consulta y el campo "Número de ejemplares" es un campo calculado como "Agrupar por: Suma" de los valores de un campo llamado "Número de ejemplares" de dicha tabla de datos original. En otras palabras, la tabla original es así:
Especie número de ejemplares ambiente
Gaviota 1 A
Gaviota 9 A
Gaviota 2 A
Gaviota 3 B
Gaviota 2 B
Gaviota 3 C
(...)
Para colmo, existe otro campo llamado "Año" y que aparece en la Consulta parametrizado para que al abrir la consulta aparezca una ventana que le diga al usuario: [Teclee el año que desee]. Al introducir las expresiones que me comentas en dicha consulta salen diversos errores y al final me dan una vista de datos vacía.
Con estos nuevos datos, espero que no muy confusos, que me sugieres.
De nuevo, mil gracias.
Si aplico las expresiones que me dices, creando una consulta a partir de la tabla que puse de ejemplo, me sale redondo. Hasta ahí, perfecto.
Pero, mi situación es ligeramente diferente ya que no la describí bien.
Lo que llamé tabla:
Especie número de ejemplares ambiente
Gaviota 12 A
Gaviota 5 B
Gaviota 3 C
Lirón 15 A
Lirón 12 C
Gineta 5 A
Gineta 10 C
, es en realidad una Consulta y el campo "Número de ejemplares" es un campo calculado como "Agrupar por: Suma" de los valores de un campo llamado "Número de ejemplares" de dicha tabla de datos original. En otras palabras, la tabla original es así:
Especie número de ejemplares ambiente
Gaviota 1 A
Gaviota 9 A
Gaviota 2 A
Gaviota 3 B
Gaviota 2 B
Gaviota 3 C
(...)
Para colmo, existe otro campo llamado "Año" y que aparece en la Consulta parametrizado para que al abrir la consulta aparezca una ventana que le diga al usuario: [Teclee el año que desee]. Al introducir las expresiones que me comentas en dicha consulta salen diversos errores y al final me dan una vista de datos vacía.
Con estos nuevos datos, espero que no muy confusos, que me sugieres.
De nuevo, mil gracias.
No hay problema en principio en usar la función DMax sobre el resultado de una consulta. El problema surge en que en una consulta de totales, el nombre del campo que es una agrupación (suma, en tu caso), se modifica y se convierte en SumaDe... Ejecuta la consulta y fíjate en lo que pone en la cabecera de la columna.
Por eso, la fórmula debería ser algo así:
DMax ("SumaDeNumero de ejemplares";"nombre de consulta";"Especie='" & Especie & "'")
Este campo no lo puedes poner en esa consulta directamente, sino que tendrás que hacer otra (consulta de la consulta), que tome el origen de valores en esa consulta.
Para evitar problemas, quítale inicialmente el parámetro Año, para que no te pregunte por el (aunque los resultados no sean reales, es solo para probar que funcione). UNa vez que funcione sin parámetro, vuélveselo a poner, y a ver (pero creo que te dará fallo). cuando llegues a este punto... seguimos.
Por eso, la fórmula debería ser algo así:
DMax ("SumaDeNumero de ejemplares";"nombre de consulta";"Especie='" & Especie & "'")
Este campo no lo puedes poner en esa consulta directamente, sino que tendrás que hacer otra (consulta de la consulta), que tome el origen de valores en esa consulta.
Para evitar problemas, quítale inicialmente el parámetro Año, para que no te pregunte por el (aunque los resultados no sean reales, es solo para probar que funcione). UNa vez que funcione sin parámetro, vuélveselo a poner, y a ver (pero creo que te dará fallo). cuando llegues a este punto... seguimos.
De nuevo muchas gracias.
He seguido las indicaciones y por el momento la cosa funciona. Es cierto que al incluir el parámetro "Año", los resultados en el campo encabezado por la expresión DMax ("SumaDeNumero de ejemplares";"nombre de consulta";"Especie='" & Especie & "'") no son reales porque sigue considerando el total de registros de los diferentes años para obtener ese valor máximo.
A partir de aquí, he querido crear otro campo en esta "consulta de consulta" a partir de la expresión que me propusiste el otro día, es decir, EsMaximo: SiInm([Numero de ejemplares] = MaxEspecie; True; False). Sin embargo, al ejecutar la consulta, en la "Vista de Hoja de Datos", todas las casillas de esta columna aparecen rellenas con #Error.
Entonces, una vez conseguido lo descrito en el primer párrafo, ¿qué me recomiendas?
Mil gracias, again
He seguido las indicaciones y por el momento la cosa funciona. Es cierto que al incluir el parámetro "Año", los resultados en el campo encabezado por la expresión DMax ("SumaDeNumero de ejemplares";"nombre de consulta";"Especie='" & Especie & "'") no son reales porque sigue considerando el total de registros de los diferentes años para obtener ese valor máximo.
A partir de aquí, he querido crear otro campo en esta "consulta de consulta" a partir de la expresión que me propusiste el otro día, es decir, EsMaximo: SiInm([Numero de ejemplares] = MaxEspecie; True; False). Sin embargo, al ejecutar la consulta, en la "Vista de Hoja de Datos", todas las casillas de esta columna aparecen rellenas con #Error.
Entonces, una vez conseguido lo descrito en el primer párrafo, ¿qué me recomiendas?
Mil gracias, again
Revisando de nuevo los datos, meta o no el parámetro Año para que me salga la ventana que diga "Teclee año", el valor máximo derivado de la expresión DMax ("SumaDeNumero de ejemplares";"nombre de consulta";"Especie='" & Especie & "'"), sigue siendo calculado tomando la totalidad de años como un conjunto y no como entidades diferentes. De ahí que los valores no se correspondan con la realidad
Vale. Entendí.
Entonces ponle una condición más al DMAX.
DMax ("SumaDeNumero de ejemplares";"nombre de consulta";"Especie='" & Especie & "' AND Año=" & Año)
Así solo te sumara lo de ese año.
Entonces ponle una condición más al DMAX.
DMax ("SumaDeNumero de ejemplares";"nombre de consulta";"Especie='" & Especie & "' AND Año=" & Año)
Así solo te sumara lo de ese año.
¡Jo! Perdona de nuevo mi torpeza...
Ya antes de leer tu respuesta intenté probar lo que me dices, aunque no sabía como escribirlo exactamente...
Gracias a tu respuesta sé que ese era el camino, pero... si copio literalmente la expresión que me decies, me arroja errores de sintaxis. He probado poner (copio literalmente desde Access):
Maximo Reg: DMáx("SumaDeNº_EJEMPLARES";"Consulta intermedia_Tabla 9_Hábitats";"NOMBRE_CIENTIFICO='" & [NOMBRE_CIENTIFICO] & "'" "' AND "AÑO"="' & AÑO &"'")
Intentando seguir en Año el mismo patrón de sintaxis que con las especies (Nombre científico, en la base de datos que estoy haciendo), pero me vuelven a aparecer errores de sintaxis y no meja... ¡sigh!
Ya antes de leer tu respuesta intenté probar lo que me dices, aunque no sabía como escribirlo exactamente...
Gracias a tu respuesta sé que ese era el camino, pero... si copio literalmente la expresión que me decies, me arroja errores de sintaxis. He probado poner (copio literalmente desde Access):
Maximo Reg: DMáx("SumaDeNº_EJEMPLARES";"Consulta intermedia_Tabla 9_Hábitats";"NOMBRE_CIENTIFICO='" & [NOMBRE_CIENTIFICO] & "'" "' AND "AÑO"="' & AÑO &"'")
Intentando seguir en Año el mismo patrón de sintaxis que con las especies (Nombre científico, en la base de datos que estoy haciendo), pero me vuelven a aparecer errores de sintaxis y no meja... ¡sigh!
El tercer algumento de DMax es una cadena, en la que tienes que integrar los valores, para que cuando lo calcule, le quede algo como esto:
Nombre_cientifico='Gaviota' AND Año=2010
Como ves, los datos tipo texto tienen que ir entre comillas simples y los de tipo numérico (asumo que el año es de ese tipo), no tienen que tener nada.
Entonces la expresión sería:
"Nombre_cientifico='" & [nombre_cientifico] & "' AND Año=" & [Año]
No te preocupes porque como se aprende es fallando y volviéndolo a intentar.
Nombre_cientifico='Gaviota' AND Año=2010
Como ves, los datos tipo texto tienen que ir entre comillas simples y los de tipo numérico (asumo que el año es de ese tipo), no tienen que tener nada.
Entonces la expresión sería:
"Nombre_cientifico='" & [nombre_cientifico] & "' AND Año=" & [Año]
No te preocupes porque como se aprende es fallando y volviéndolo a intentar.
¡OK! Solucionado este primer paso gracias a tu valiosísima ayuda...
Ahora, creo otra columna con la expresión:
EsMaximo: SiInm([SumaDeNº_EJEMPLARES] = Maximo Reg; True; False)
Donde "Máximo Reg" es el campo obtenido con la aplicación de la expresión de tipo DMax antes discutida. Sin embargo, al ejecutar la consulta, todos los registros del nuevo campo "EsMaximo" me aparecen como #Error.
¿Me podrías ayudar para culminar la consulta de marras? Gracias y más gracias.
Ahora, creo otra columna con la expresión:
EsMaximo: SiInm([SumaDeNº_EJEMPLARES] = Maximo Reg; True; False)
Donde "Máximo Reg" es el campo obtenido con la aplicación de la expresión de tipo DMax antes discutida. Sin embargo, al ejecutar la consulta, todos los registros del nuevo campo "EsMaximo" me aparecen como #Error.
¿Me podrías ayudar para culminar la consulta de marras? Gracias y más gracias.
Pon entre corchetes Máximo Reg, para que lo tome como un todo.
EsMaximo: SiInm([SumaDeNº_EJEMPLARES] = [Maximo Reg]; True; False)
Una buena costumbre es que no dejes espacios en los nombres de los campos, formularios, etc... ni que introduzcas raracteres raros (estilo ñ...)
EsMaximo: SiInm([SumaDeNº_EJEMPLARES] = [Maximo Reg]; True; False)
Una buena costumbre es que no dejes espacios en los nombres de los campos, formularios, etc... ni que introduzcas raracteres raros (estilo ñ...)
Perdona, de nuevo. Los corchetes ya los puse por lo que la expresión que coloqué es como ésta que me escribes. Sin embargo, las casillas siguen apareciendo como #Error
Puedes hacer un campo que sea:
Aux: [SumaDeNº_EJEMPLARES] - [Maximo Reg]
Hazlo con el Generador de expresiones, para evitar errores de trascripcion.
Aux: [SumaDeNº_EJEMPLARES] - [Maximo Reg]
Hazlo con el Generador de expresiones, para evitar errores de trascripcion.
- Compartir respuesta
- Anónimo
ahora mismo