2011-05-03 81 views
9

我打我的大腦對這一SQL Server查詢左加入,SUM和GROUP BY,我很難過!

我有3個SQL Server 2005的表

userawards

id, awardamount, userid, dateawarded, awardtypeid 

用戶:

id, firstname, lastname 

awardtypes:

id, title 

因此,如果awards表有行

1, 300.00, 3, 01-01-2011, 1 
2, 125.00, 3, 01-05-2011, 1 
3, 50.00, 2, 01-05-2011, 2 

用戶錶行

1, john, smith 
2, mark, smith 
3, bob, smith 

獎勵類型

1, cash 
2, prize 

,我所要的輸出類似於至這

bob smith, 425.00, cash 
mark smith, 50, prize 

等等等等

用戶可以擁有多個獎項,結果需要顯示獨特的用戶,但有總獎金額。此外,還需要有2個連接,一個用於獲取用戶表中的用戶名/最後一個用戶表和獎勵類型標題。

所以我的查詢看起來像這樣(我知道這是行不通的)

SELECT id, userid, awardtypeid, SUM(awardamount) 
FROM awards a 
LEFT JOIN userinfo ui ON ui.userid = a,userid 
LEFT JOIN awardtypes ON awardtypesid = a.awardtypeid 
GROUP BY userid 

這甚至可能嗎?

+1

如果用戶擁有不同類型的獎勵多,應該是什麼預期的輸出? – Thomas 2011-05-03 17:23:55

+0

這將有助於向我們展示一些樣本輸入和預期輸出。另外,什麼版本的SQL Server? – Thomas 2011-05-03 17:24:38

+0

你有一個,而不是。在a中,userid – extraneon 2011-05-03 17:31:59

回答

16

你可能想

SELECT userid, 
     awardtypeid, 
     SUM(awardamount) 
FROM awards a 
     LEFT JOIN userinfo ui 
     ON ui.userid = a.userid 
     LEFT JOIN awardtypes 
     ON awardtypesid = a.awardtypeid 
GROUP BY userid, 
      awardtypeid 

SELECT userid, 
     SUM(awardamount) 
FROM awards a 
     LEFT JOIN userinfo ui 
     ON ui.userid = a.userid 
     LEFT JOIN awardtypes 
     ON awardtypesid = a.awardtypeid 
GROUP BY userid 

這下降的ID列(可能不是你想要的組什麼的)

在第一種情況下,我包括在awardtypeid選擇,但這意味着你也必須添加到該組。

+0

我會投票,但我沒有代表呢..但是,這就解決了我的問題。謝謝! – Sherdog 2011-05-03 17:35:43

+0

+1能夠從所給出的(以及答案)中收集到希望的東西。 – Thomas 2011-05-03 18:45:14

+0

謝謝康拉德,我已經接受了你的回答:)謝謝你的提醒。我看着右過去的複選標記。是的,謝謝你提供的答案,我不好的嘗試解釋情況:D – Sherdog 2011-05-03 20:09:47

0

你可以做到這一點,但你現在的做法是,它會顯示獎勵數量,或者實際上獎勵總數 - 但是每個ID,用戶,獎勵類型組合。你需要抓住的本身獎項用戶和金額,然後加入與awardtype ID - 要知道,獎勵之和爲重複每awardtypeid

SELECT 
    ??.id , 
    a.userid , 
    a.awardtypeid , 
    ab.awardamount , 
    <whateverelse> 
FROM 
    (select userid, SUM(awardamount) as awardamount FROM awards GROUP BY userid) AS ab 
INNER JOIN awards AS a on ab.userid = a.userid 
LEFT JOIN userinfo AS ui 
    ON ui.userid = a.userid 
LEFT JOIN awardtypes AS at 
    ON awardtypesid = a.awardtypeid 

通過合計每個用戶awardamount的總和在加入之前,你應該能夠得到你想要的東西,不需要任何分組。

0
SELECT 
    ui.FirstName 
,ui.LastName 
,at.Title AS Award 
,SUM(a.AwardAmount) AS AwardAmount 
FROM Awards a 
    INNER JOIN UserInfo ui ON ui.UserId = a.UserId 
    INNER JOIN AwardTypes at ON at.AwardTypeId = a.AwardTypeId 
GROUP BY ui.FirstName, ui.LastName, at.Title 
ORDER BY ui.LastName, ui.FirstName 
0

如果我理解正確的這個,應該有每個用戶不超過一個排,你需要每用戶總獎勵金額。 另一方面,你想知道每個用戶有什麼樣的獎項。 您可以顯示逗號分隔的獲獎名單爲每個用戶:

select 
    usr.FirstName, 
    usr.LastName, 
    awd.AwardAmount, 
    AwardTypes = ( 
     select Title + ',' 
     from UserAwards uaw 
      join AwardTypes awt on 
       uaw.AwardTypeId = awt.Id 
     where uaw.UserId = usr.id 
     for xml path('')) 
from [User] usr 
    join (
     select UserId, sum(AwardAmount) AwardAmount 
     from UserAwards uaw 
     group by UserId 
    ) awd on 
     awd.UserId = usr.Id