2011-08-16 15 views
5

Lo que estoy tratando de hacer es añadir otra columna que calcula (cr - dr)reutilización de alias en SELECT

En vista de que no se puede volver a utilizar un alias dentro de una cláusula SELECT, ¿cómo ir sobre calculatin total

SELECT SUM(b.bet_win * cy.fx_rate)as dr, SUM(b.bet_loss * cy.fx_rate) as cr, cr+dr as total 
    FROM .... 
    WHERE .... 
+1

Es una pena que su sintaxis sugerida sea ilegal en SQL estándar porque tal flexibilidad sería útil. Fwiw la suya sería una sintaxis válida de acceso (ACE, Jet, lo que sea), sin embargo requiere acceso las expresiones que ser evaluados de izquierda a derecha y de pedidos de columna de SQL sólo hace aún más inflexibles de lo que ya es posible :( – onedaywhen

+0

duplicado de [Can me resuse un campo calculado en una consulta SELECT?] (http://stackoverflow.com/questions/6085443/can-i-resuse-a-calculated-field-in-a-select-query) –

Respuesta

9

En SQL Server u Oracle, que haría uso de un CTE, pero ya que estás usando MySQL, se haría uso de una subconsulta:

SELECT dr, cr, cr + dr as total 
FROM (
    SELECT 
     SUM(b.bet_win * cy.fx_rate) as dr, 
     SUM(b.bet_loss * cy.fx_rate) as cr 
    FROM .... 
    WHERE ....) t; 
6

no estoy seguro, pero no es usando un user variable más rápido en este caso?

SELECT 
    @dr:=SUM(b.bet_win * cy.fx_rate), 
    @cr:=SUM(b.bet_loss * cy.fx_rate), 
    @[email protected] as total 
+3

las variables definidas por el usuario Don No funcionan de esa manera, al menos en MySQL. El valor de @dr y @cr no se establece hasta * después de * que la fila se haya procesado. Cuando se genera la primera fila del conjunto de resultados @dr es NULL y @ cr es NULL, por lo que 'total' es NULL. Entonces @dr se establece en la suma de victorias, y @cr la suma de las pérdidas. Cuando se construye la segunda fila y calcula' @dr total' y @cr tener los valores de la fila anterior. Por lo tanto, "total" será el total de la fila anterior. – jtanium

+1

¡Guau, de hecho! Los editores manuales de MySQL deben poner esto en la parte superior de la página en anuncio de mucho más tarde. Gracias, jtanium, por dejarnos saber. –

1

Puede repetir los cálculos en la columna "total".

SELECT 
    SUM(b.bet_win * cy.fx_rate) as dr, 
    SUM(b.bet_loss * cy.fx_rate) as cr, 
    SUM(b.bet_win * cy.fx_rate) + SUM(b.bet_loss * cy.fx_rate) as total 
FROM .... 
WHERE ....