2016-02-27 28 views
1

我有兩個不同的Select語句產生正確的結果,但我很好奇這是否可以在一個Select中完成?多個SQL Select與不同Where Where's into one選擇

SELECT UserInfo.Id, AVG(BalanceInfo.Bet) as 'Avg bet' 
FROM [USERINFO] as UserInfo 
JOIN [BALANCEINFO] as BalanceInfo 
ON UserInfo.Id = BalanceInfo.UserId 
WHERE UserInfo.RoomId = 84 AND BalanceInfo.Bet != 0 
GROUP BY UserInfo.Id 

SELECT UserInfo.Id, SUM(BalanceInfo.Profit) as 'Deposits' 
FROM [USERINFO] as UserInfo 
JOIN [BALANCEINFO] as BalanceInfo 
ON UserInfo.Id = BalanceInfo.UserId 
WHERE UserInfo.RoomId = 84 AND BalanceInfo.ChangeType = 8 AND BalanceInfo.Profit > 0 
GROUP BY UserInfo.Id 

正如您可能會看到區別在Where語句中。

第一個Select爲每個用戶產生平均賭注,第二個Select爲每個用戶產生存款總和,這是兩個不同的表。可以用一個來完成嗎?

回答

2

你可以使用CASE語句在聚合函數:

SELECT UserInfo.Id, 
    AVG(CASE WHEN BalanceInfo.Bet != 0 THEN BalanceInfo.Bet ELSE NULL END) as 'Avg bet', 
    SUM(CASE WHEN BalanceInfo.ChangeType = 8 AND BalanceInfo.Profit > 0 
     THEN BalanceInfo.Profit ELSE NULL END) as 'Deposits' 
FROM [USERINFO] as UserInfo 
JOIN [BALANCEINFO] as BalanceInfo 
ON UserInfo.Id = BalanceInfo.UserId 
WHERE UserInfo.RoomId = 84 
GROUP BY UserInfo.Id 

主要在這裏點是確保只提供匹配的值來聚合函數,而在其他情況下NULLNULL值在集合函數中被忽略,因此只計算您所需的值

+0

你是100%正確的,這是驚人的有多快我得到了答案,並有多長,我一直努力在這。謝謝。我會更深入地探討這個話題! –

0

您正在使用兩個不同的表來獲取和求和。下面的查詢可以幫助你獲得。

SELECT UserInfo.Id, AVG(BalanceInfo.Bet) as 'Avg bet',SUM(BalanceInfo.Profit) as 'Deposits' FROM [USERINFO] as UserInfo JOIN [BALANCEINFO] as BalanceInfo ON UserInfo.Id=BalanceInfo.UserId WHERE UserInfo.RoomId = 84 AND BalanceInfo.Bet != 0 AND BalanceInfo.ChangeType = 8 AND BalanceInfo.Profit > 0 GROUP BY UserInfo.Id

+0

我做到了這一點,它給出了另一個結果,而不是我所需要的。我需要的是'dotnetom'aka首先回答這個問題:) –