2012-01-27 11 views
5

Estoy usando SQL Server 2008.¿Cómo hacer la adición y división de columnas con alias en una consulta?

Estoy tratando de hacer algunos cálculos básicos en algunas consultas básicas. Necesito sumar ganancias, pérdidas, total y porcentajes. Normalmente solicito los números brutos y luego hago los cálculos una vez que regreso mi consulta a la página. Me gustaría darle a SQL Server la oportunidad de trabajar un poco más.

Lo que quiero hacer es algo como esto:

SELECT SUM(case when vote = 1 then 1 else 0 end) as TotalWins, 
     SUM(case when vote = 0 then 1 else 0 end) as TotalLosses, 
     TotalWins + TotalLosses as TotalPlays, 
     TotalPlays/TotalWins as PctWins 

Esto es lo que estoy haciendo ahora:

SELECT SUM(case when vote = 1 then 1 else 0 end) as TotalWins, 
     SUM(case when vote = 0 then 1 else 0 end) as TotalLosses, 
     SUM(case when vote = 1 then 1 else 0 end) + SUM(case when vote = 0 then 1 else 0 end) as Votes 

¿Cuál es la forma más fácil y limpia de hacer cálculos matemáticos sencillos como este en ¿una consulta?

* EDIT: *

Aunque tengo algunas grandes respuestas, no he tenido lo que yo estaba buscando.

Las puntuaciones que seré el cálculo son para un equipo específico, así, mis resultados tienen que ser así:

TeamID Team Wins Losses Totals 
1  A's  5  3  8 
2  Bee's 7  9  16 
3  Seas 1  3  4 

SELECT T.TeamID, 
     T.Team, 
     V.TotalWins, 
     V.TotalLosses, 
     V.PctWins 
FROM  Teams T 

     JOIN 

    SELECT V.TeamID, 
      SUM(case when vote = 1 then 1 else 0 end) as V.TotWin, 
      SUM(case when vote = 0 then 1 else 0 end) as V.TotLoss 
    FROM Votes V 
GROUP BY V.TeamID 

He intentado un montón de cosas, pero no muy bien qué mal. Estoy seguro de que la parte JOIN es donde está el problema. ¿Cómo reúno estos dos conjuntos de resultados?

Respuesta

9

Una manera es envolver su consulta en uno externo:

SELECT TotalWins, 
     TotalLosses, 
     TotalWins + TotalLosses as TotalPlays, 
     TotalPlays/TotalWins as PctWins 
FROM 
(SELECT SUM(case when vote = 1 then 1 else 0 end) as TotalWins, 
     SUM(case when vote = 0 then 1 else 0 end) as TotalLosses 
    FROM ... 
) 

Otra forma (sugerido por @Mike Christensen) es utilizar Common Table Expressions (CTE):

; WITH Calculation AS 
    (SELECT SUM(case when vote = 1 then 1 else 0 end) as TotalWins, 
      SUM(case when vote = 0 then 1 else 0 end) as TotalLosses 
     FROM ... 
    ) 

SELECT TotalWins, 
     TotalLosses, 
     TotalWins + TotalLosses as TotalPlays, 
     TotalPlays/TotalWins as PctWins 
FROM 
     Calculation 

Nota al margen: Ni idea de si esto significaría cualquier diferencia de rendimiento en SQL-Server pero también puede escribir estas sumas:

SUM(case when vote = 1 then 1 else 0 end) 

como recuentos:

COUNT(case when vote = 1 then 1 end) --- the ELSE NULL is implied 
+0

¡Interesante! Voy a darle un giro. –

+0

'+ 1' - ¿Tal vez un CTE también funcionaría bien? –

+0

@MikeChristensen: Sí, un CTE también funcionaría. –

4

intenta

select a, b, a+b as total 
from (
    select 
    case ... end as a, 
    case ... end as b 
    from realtable 
) t 
2

Podría ayudar si usted está haciendo este tipo de cosas más de una vez para crear una vista ...

CREATE VIEW [Totals] 
SELECT 
    SUM(case when T.vote = 1 then 1 else 0 end) as TotalWins, 
    SUM(case when T.vote = 0 then 1 else 0 end) as TotalLosses, 
    T.SomeGroupColumn 
FROM SomeTable T 
GROUP BY T.SomeGroupColumn 
+0

Por cierto. Prefiero la respuesta de CTE ya mencionada si desea resolver esto como una única opción en lugar de reutilizable. – perfectionist

3

Para responder a su segunda pregunta, este es el código que presenta con correcciones a la sintaxis:

SELECT 
    T.TeamID, 
    T.Team, 
    V.TotalWins, 
    V.TotalLosses, 
    PctWins = V.TotalWins * 100/CAST(V.TotalWins + V.TotalLosses AS float) 
FROM Teams T 
JOIN (
    SELECT 
     TeamID, 
     SUM(case when vote = 1 then 1 else 0 end) as TotalWins, 
     SUM(case when vote = 0 then 1 else 0 end) as TotalLosses 
    FROM Votes 
    GROUP BY TeamID 
    ) as V on T.TeamID = V.TeamID 

Observe los soportes alrededor de la selección interior.

Cuestiones relacionadas