2011-12-30 18 views
5

Tengo una consulta MySQL que ejecuta una operación breve (sumando los recuentos en una declaración select) y quiero usar el resultado para hacer una operación matemática, pero me aparece un error.Columna generada por el uso de MySQL en la consulta de selección

Tabla:

id | group | count | 
----------------------------- 
1  1   3 
2  1   2 

Consulta:

select id, count, 
    (select sum(count) from table group by group) as total, 
    count/total as percent 
from table 

El error se debe a que no hay una verdadera columna "total" en la tabla. ¿Cómo puedo hacer que la consulta funcione?

+1

usted no está dando ningún mensaje de error. – hakre

+1

¡Disculpa! Pensé que lo describí con el último párrafo, pero oficialmente el error es 'ERROR 1054 (42S22): columna desconocida 'total' en 'lista de campo'' – MechEngineer

Respuesta

18

Puede guardar total como variable, y luego usar eso en el cálculo de división.

SELECT 
    `id`, `count`, 
    @total:=(SELECT sum(`count`) FROM `table` GROUP BY `group`) AS `total`, 
    `count`/@total AS `percent` 
FROM `table` 

NOTA: GROUP es una reserved word en MySQL. Usted debe enciérrelo (y todos los demás nombres de campo/tabla) en los palos de atrás (`).

+0

BOOM, ¡tenemos un ganador! Gracias, Rocket. – MechEngineer

+0

@MechEngineer: De nada. Me alegro de poder ayudar :-) –

+3

La documentación de MySQL advierte en contra de hacer esto. "Como regla general, salvo en las sentencias SET, nunca debe asignar un valor a una variable de usuario y leer el valor dentro de la misma declaración ... puede obtener los resultados que espera, pero esto no está garantizado". Ver http://dev.mysql.com/doc/refman/5.7/en/user-variables.html – PaulC

0

group es una palabra reservada en MySQL, como es table, debe usarlo como:

select id, count, (select sum(count) from `table` group by `group`) as total, count/total as percent from `table` 

Para más información: MySQL Reserved Words

Usted verá allí que en realidad se puede utilizar pero count Me gustaría poner todos los nombres de tabla y columna entre comillas de todos modos.

0

Su problema es que la consulta interna necesita generar 1 resultado por fila, no 1 para cada grupo. Si desea añadir una cláusula en donde en la consulta interna diciendo algo como

where inner_table.group = outer_table.group

de manera que sólo se devuelve un resultado.

2

También puede hacer esto sin introducir una variable:

select id, 
    count, 
    (select sum(count) from `table` group by `group`) as total, 
    (select count/total) as percent 
from `table`; 

Produce:

+------+-------+-------+---------+ 
| id | count | total | percent | 
+------+-------+-------+---------+ 
| 1 |  3 |  5 | 0.6000 | 
| 2 |  2 |  5 | 0.4000 | 
+------+-------+-------+---------+ 
2 rows in set (0.05 sec) 
Cuestiones relacionadas