2011-06-15 27 views
5

No sé exactamente cómo redactar esta pregunta, pero aquí está. Quiero reutilizar los valores que calculé en mi consulta para calcular otro valor. Variables es la palabra correcta, supongo. aquí está mi consulta:Mysql - reutilizando los valores calculados

SELECT 
    t1.label as label,SUM(t1.totalEvents) as Entry,SUM(t2.totalEvents) as Back, 
    ROUND(Entry/Back*100,2) as 'Rate' 
FROM 
    trackReports_daily t1 
.... rest of query ... 

interior redondo quiero utilizar el valor devuelto por SUM (t1.totalEvents), pero cuando se utiliza Entry me sale este error Unknown column 'Entry' in 'field list'

cómo puedo obtener el valor en allí sin volver a calcular cada vez como esto:

ROUND(SUM(t2.totalEvents)/SUM(t1.totalEvents)*100,2) 
+0

relacionadas: http://stackoverflow.com/questions/1368084/can-i-re-use -an-expression-in-a-mysql-query-as-a-variable-for-another-field –

+0

posible duplicado de [¿Puedo volver a utilizar un campo calculado en una consulta SELECT?] (http://stackoverflow.com/ preguntas/6085443/can-i-resuse-a-calculado-campo-en-una-selección-consulta) –

Respuesta

5

Se podría utilizar una subconsulta:

SELECT label, Entry, Back, ROUND(Entry/Back*100,2) as 'Rate' 
FROM (
    SELECT SUM(t1.totalEvents) as Entry, SUM(t2.totalEvents) as Back, t1.label as label 
    FROM trackReports_daily t1 
    .... rest of query ... 
) as temp; 
+1

Esta es la consulta más rápida, gracias señor – Ibu

1

una opción sería utilizar una subconsulta en la cláusula FROM como:

SELECT 
    t1.label as label,SUM(t1.totalEvents) as Entry,t2.Back, 
    ROUND(t1.Entry/t2.Back*100,2) as 'Rate' 
FROM 
    (SELECT *, SUM(totalEvents) as Entry FROM trackReports_daily) t1 
    (SELECT *, SUM(totalEvents) as Back FROM someTable) t2 
.... rest of query ... 

Si desea volver a utilizar la frecuencia en otras consultas, se complicará y no sé si tendrá un rendimiento óptimo, pero creo que hará lo que usted solicitó en su ejemplo.

10

Tome un vistazo a este ejemplo

select (select @t1:=sum(field1)),(select @t2:=sum(field2)),@t1/@t2 from table 
+0

Esto es en realidad la mejor respuesta. Es tan fácil de hacer en MySQL, sin embargo, la mayoría de las personas que no conocen esta característica tienden a usar subconsultas. –

+1

Según la documentación de MySQL "el orden de evaluación de las expresiones que involucran variables de usuario no está definido" http://dev.mysql.com/doc/refman/5.6/en/user-variables.html ¿Es segura esta solución? – Andrea

+1

Esta no es una buena práctica; resultados no garantizados Manual de MySQL: "como regla general, salvo en las sentencias SET, nunca debe asignar un valor a una variable de usuario ...". "Para otras declaraciones, como SELECT, puede obtener los resultados que espera, pero esto no está garantizado". – bbe

Cuestiones relacionadas