2012-01-27 7 views
5

Sto utilizzando SQL Server 2008.Come eseguire l'aggiunta e la divisione di colonne con alias in una query?

Sto cercando di fare alcuni calcoli di base in alcune query di base. Ho bisogno di sommare vincite, perdite, totale e percentuali. Di solito chiedo i numeri grezzi e poi eseguo i calcoli una volta che rendo la mia query alla pagina. Vorrei dare a SQL Server l'opportunità di lavorare un po 'di più.

Quello che voglio fare è qualcosa di simile:

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 

Ecco quello che sto facendo ora:

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 

Qual è il modo più pulito più semplice per fare semplici calcoli matematici come questo in una domanda?

* EDIT: *

Mentre ho ottenuto alcuni grandi risposte, non ho ottenuto quello che cercavo.

I punteggi che sarò calcolo sono per una squadra specifica, così, i miei risultati devono essere come questo:

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 

Ho provato un sacco di cose, ma non so bene cosa sbagliata. Sono sicuro che la parte JOIN è dove il problema è però. Come posso riunire questi due set di risultati?

risposta

9

Un modo è quello di avvolgere la query in uno esterno:

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 ... 
) 

Un altro modo (suggerito da @Mike Christensen) è quello di utilizzare 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 a margine: Non ho idea se questo significherebbe qualsiasi differenza di preformance in SQL-Server ma puoi anche scrivere queste somme:

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

come conta:

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

Interessante! Gli darò un vortice. –

+0

'+ 1' - Forse un CTE funzionerebbe bene anche tu? –

+0

@MikeChristensen: Sì, funzionerebbe anche un CTE. –

4

tentano

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

potrebbe aiutarti se stai facendo questo genere di cose più di una volta per creare 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

Btw. Preferisco la risposta CTE elencata già se vuoi risolvere questo come una tantum piuttosto che riutilizzabile. – perfectionist

3

Per rispondere alla tua seconda domanda, questo è il codice che hai inoltrato con correzioni alla sintassi:

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 

Annotare le parentesi attorno alla selezione interna.

Problemi correlati