6 messages in com.mysql.lists.mysql-esRe: Sum DISTINCT| From | Sent On | Attachments |
|---|---|---|
| Leonardo Aguilar | 10 Oct 2006 07:29 | |
| Alvaro Cobo | 10 Oct 2006 09:58 | |
| Leandro Oliveri | 10 Oct 2006 10:03 | |
| Alvaro Cobo | 10 Oct 2006 11:10 | |
| Roger Martinez | 11 Oct 2006 02:41 | |
| Jesús Gómez | 11 Oct 2006 03:17 |
| Subject: | Re: Sum DISTINCT![]() |
|---|---|
| From: | Leandro Oliveri (l.m....@gmail.com) |
| Date: | 10/10/2006 10:03:48 AM |
| List: | com.mysql.lists.mysql-es |
Hola Alvaro, la query que haces te falta agrupar, de acuerdo la estructura de la tabla por nombre_familia. Te quedaria asi.
SELECT credito.anio, Sum(familia.hombres) AS Total_Hombres, Sum(familia.mujeres) AS Total_Mujeres FROM credito LEFT JOIN familia ON credito.id_familia = familia.id_familia GROUP BY credito.anio, familia.nombre_familia
On 10/10/06, Alvaro Cobo <cobo...@gmail.com> wrote:
Estimad@s amig@s:
Tengo un dilema que no logro resolver. Tengo dos tablas. Una de ellas almacena créditos y los años en que han sido otorgados. La otra almacena datos de familias que han recibido los créditos y además incluye el número de hombres y mujeres en cada familia. Cada familia puede participar en mas de un crédito.
La consulta que necesito obtener es: Suma de hombres y mujeres de las familias que han participado de algún crédito durante cada año.
SELECT credito.anio, Sum(familia.hombres) AS Total_Hombres, Sum(familia.mujeres) AS Total_Mujeres FROM credito LEFT JOIN familia ON credito.id_familia = familia.id_familia GROUP BY credito.anio;
+------+---------------+---------------+ | anio | Total_Hombres | Total_Mujeres | +------+---------------+---------------+ | 2005 | 21 | 23 | | 2006 | 11 | 9 | +------+---------------+---------------+
El caso es que, como las familias pueden participar en más de un crédito, al hacer la suma, las filas de las familias se duplican y la suma resulta demasiado alta (Total hombres en realidad debería ser 12), por lo que se necesita hacer alguna suerte de DISTINCT, que nos permita sumar las familias por una sola vez. He intentado de todo y nada.
Espero haberme explicado. Por favor avísenme si necesitan alguna aclaración.
Les agradezco mucho.
Alvaro
MySQL version 5.0.17 SO: Debian Sarge.
Tabla de ejemplo. Base de datos test.
CREATE TABLE `familia` ( `id_familia` int(11) NOT NULL auto_increment, `nombre_familia` varchar(60) NOT NULL, `hombres` int(11) NOT NULL, `mujeres` int(11) NOT NULL, PRIMARY KEY (`id_familia`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
INSERT INTO `familia` VALUES (1, 'Perez', 2, 3); INSERT INTO `familia` VALUES (2, 'Suarez', 5, 3); INSERT INTO `familia` VALUES (3, 'Sanchez', 6, 6); INSERT INTO `familia` VALUES (4, 'Montalvo', 4, 5); INSERT INTO `familia` VALUES (5, 'Cobo', 4, 3); INSERT INTO `familia` VALUES (6, 'Larrea', 1, 3);
CREATE TABLE `credito` ( `anio` year(4) NOT NULL, `id_credito` int(11) NOT NULL auto_increment, `id_familia` int(11) NOT NULL, PRIMARY KEY (`id_credito`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
INSERT INTO `credito` VALUES (2005, 1, 1); INSERT INTO `credito` VALUES (2005, 2, 1); INSERT INTO `credito` VALUES (2005, 3, 1); INSERT INTO `credito` VALUES (2005, 4, 3); INSERT INTO `credito` VALUES (2005, 5, 4); INSERT INTO `credito` VALUES (2005, 6, 2); INSERT INTO `credito` VALUES (2006, 7, 2); INSERT INTO `credito` VALUES (2006, 8, 3);
-- Lista de Correos de MySQL Para el historial de la lista: http://lists.mysql.com/mysql-es Para cancelar inscripción: http://lists.mysql.com/mysql-es?unsub=l.m....@gmail.com




