Как сделать сложение и разделение столбцов с псевдонимами в запросе? - PullRequest
5 голосов
/ 28 января 2012

Я использую SQL Server 2008.

Я пытаюсь выполнить базовую математику в некоторых базовых запросах.Мне нужно сложить выигрыши, проигрыши, итоги и проценты.Я обычно спрашиваю необработанные числа и затем делаю вычисления, как только я возвращаю свой запрос на страницу.Я хотел бы дать SQL Server возможность работать немного усерднее.

Я хочу сделать что-то вроде этого:

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

Вот что я делаю сейчас:

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

Какой самый простой и чистый способ выполнения простых математических вычислений, подобных этому, в запросе?

* РЕДАКТИРОВАТЬ: *

Хотя я получил некоторыеотличные ответы, я не получил то, что искал.

Оценки, которые я буду рассчитывать, относятся к конкретной команде, поэтому мои результаты должны быть такими:

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

Я перепробовал несколько вещей, но не совсемзнаю что не так.Я уверен, что часть JOIN - это проблема.Как мне объединить эти два набора результатов?

Ответы [ 4 ]

10 голосов
/ 28 января 2012

Один из способов - обернуть ваш запрос во внешний:

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

Другой способ (предложенный @ Mike Christensen ) состоит в использовании Общих табличных выражений (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 

Примечание. Не знаю, будет ли это означать разницу в производительности в SQL-Server, но вы также можете написать следующие суммы:

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

как считается:

COUNT(case when vote = 1 then 1 end)    --- the ELSE NULL is implied
4 голосов
/ 28 января 2012

попробуй

select a, b, a+b as total
from (
  select
    case ... end as a,
    case ... end as b
  from realtable
) t
3 голосов
/ 28 января 2012

Чтобы ответить на ваш второй вопрос, это код, который вы выдвинули с исправлениями синтаксиса:

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

Обратите внимание на скобки вокруг внутреннего выбора.

2 голосов
/ 28 января 2012

Это может помочь вам, если вы делаете такое несколько раз, чтобы создать представление ...

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...