6 messages in com.mysql.lists.mysql-esRe: Sum DISTINCT
FromSent OnAttachments
Leonardo Aguilar10 Oct 2006 07:29 
Alvaro Cobo10 Oct 2006 09:58 
Leandro Oliveri10 Oct 2006 10:03 
Alvaro Cobo10 Oct 2006 11:10 
Roger Martinez11 Oct 2006 02:41 
Jesús Gómez11 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);