2012-01-27 35 views
5

Tôi đang sử dụng SQL Server 2008.Làm cách nào để bổ sung và phân chia các cột bí danh trong truy vấn?

Tôi đang cố gắng thực hiện một số phép toán cơ bản trong một số truy vấn cơ bản. Tôi cần cộng các thắng, thua, tổng và tỷ lệ phần trăm. Tôi thường yêu cầu các số liệu thô và sau đó thực hiện các phép tính khi tôi trả lại truy vấn của mình cho trang. Tôi muốn cho SQL Server cơ hội làm việc chăm chỉ hơn một chút.

Những gì tôi muốn làm là một cái gì đó như thế này:

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 

Đây là những gì tôi đang làm bây giờ:

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 

cách dễ sạch nhất để làm các phép tính toán đơn giản như thế này trong là gì một truy vấn?

* EDIT: *

Trong khi tôi có một số câu trả lời tuyệt vời, tôi đã không nhận được những gì tôi đang tìm kiếm.

Điểm mà tôi sẽ được tính là dành cho một nhóm cụ thể, vì vậy, kết quả của tôi cần phải được như thế này:

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 

Tôi đã thử một bó của sự vật, nhưng hoàn toàn không biết những gì sai. Tôi chắc chắn phần JOIN là nơi mà vấn đề là mặc dù. Làm thế nào để tôi mang hai bộ kết quả này lại với nhau?

Trả lời

9

Một cách là để bọc truy vấn của bạn trong một bên ngoài một:

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

Một cách khác (được đề xuất bởi @Mike Christensen) là sử dụng 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 

Sidenote: Không có ý tưởng nếu điều này có nghĩa là bất kỳ sự khác biệt về preformance nào trong SQL-Server nhưng bạn cũng có thể viết các khoản tiền này:

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

như đếm:

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

Thú vị! Tôi sẽ cho nó một vòng xoáy. –

+0

'+ 1' - Có thể CTE cũng hoạt động tốt? –

+0

@MikeChristensen: Có, CTE cũng sẽ hoạt động. –

4

thử

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

Nó có thể giúp bạn nếu bạn đang làm việc này nhiều hơn một lần để tạo ra một cái nhìn ...

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. Tôi thích câu trả lời CTE được liệt kê nếu bạn muốn giải quyết câu trả lời này như một câu trả lời thay vì sử dụng lại được. – perfectionist

3

Để trả lời câu hỏi thứ hai của bạn, đây là mã bạn đưa ra với các sửa đổi cho cú pháp:

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 

Lưu ý các dấu ngoặc xung quanh lựa chọn bên trong.

Các vấn đề liên quan