MySQL select sum con group by da resultados enteros
Pregunta
Tengo 2 tablas:
CREATE TABLE `product_det` (
`id` bigint(12) unsigned NOT NULL AUTO_INCREMENT,
`prod_name` varchar(64) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `product_det` (`id`,`prod_name`) VALUES
(1,'Pepper'),
(2,'Salt'),
(3,'Sugar');
CREATE TABLE `product_oper` (
`id` bigint(12) unsigned NOT NULL AUTO_INCREMENT,
`prod_id` bigint(12) unsigned NOT NULL,
`prod_quant` decimal(16,4) NOT NULL DEFAULT '1.0000',
`prod_value` decimal(18,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `product_oper` (`id`,`prod_id`,`prod_quant`,`prod_value`) VALUES
(12,2,'3.0000','26.14'),
(13,2,'0.0450','26.23'),
(14,2,'0.0300','26.14'),
(10,1,'0.0600','13.20'),
(11,1,'0.0600','13.20');
Quiero encontrar la cantidad y el valor de cada producto sumando los valores en la segunda tabla.
Mi consulta es:
SELECT product_det.*, SUM(in_out.p_q) as q, SUM(in_out.p_val) AS val
FROM
(SELECT product_oper.prod_id as p_id, SUM(product_oper.prod_quant) as p_q, SUM(product_oper.prod_quant*product_oper.prod_value) as p_val
FROM product_oper
GROUP BY product_oper.prod_id
) AS in_out
LEFT JOIN product_det ON in_out.p_id=product_det.id
GROUP BY in_out.p_id
HAVING q<>0.00 ORDER BY val;
El resultado que obtengo es:
id, prod_name, q, val
1, 'Pepper', 0.1200, 2
2, 'Salt', 3.0750, 80
Lo que está mal, los valores de la columna val
son enteros, y no deberían serlo.
Sin embargo, la selección interna da el siguiente resultado:
p_id, p_q, p_val
1, 0.1200, 1.584000
2, 3.0750, 80.384550
El problema es: ¿por qué obtengo valores enteros para val
cuando selecciono de la subconsulta? ¿Y por qué q
no es entero?
Necesito usar subconsultas, porque mi consulta original era así:
SELECT ... FROM (SELECT ... UNION SELECT ...) AS in_out GROUP BY in_out.p_id
Tengo MySQL versión 5.1.39
Solución
¿Has intentado convertir tu campo a un decimal? Lamentablemente, flotante no está disponible, pero el decimal es de la versión 5.0.8.
SELECT product_det.*, SUM(in_out.p_q) as q, SUM(CAST(in_out.p_val AS DECIMAL)) AS val
Y en la selección interna;
...CAST(SUM(product_oper.prod_quant*product_oper.prod_value) AS DECIMAL) as p_val...
Solo un pensamiento.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow