2013-04-05 54 views
3

本網站的首次發帖,但過去我已經使用過很多次。我確實試圖尋找答案,但無法確定如何正確地設定問題,所以這裏就是了。SQL Server將行聚合爲列值

我有一個表,其中每行的評估數爲1,2,3或4.每行也有一個ID,它是成員資格表的外鍵,另一個ID是其他外鍵與該行相關的數據(一個保存測試信息的表)。

我需要做的是通過會員組過濾器,記錄這個列表,然後創建某種類型列出的輸出查詢:

  1. 測試ID
  2. 是記錄的數量評價,以1
  3. 被評估爲2
  4. 被評價爲3
  5. 被評估至4
  6. 的記錄的數量的記錄的數量的記錄數

我可以計算出如何分別使用像得到每個評價數的計數:

SELECT Count(Eval), scores.TestID 
FROM membership INNER JOIN (scores INNER JOIN tests ON scores.TestID = tests.TestID) ON membership.ID = scores.ClientID 
WHERE membership.GroupID = <MembershipGroup> AND scores.Eval = 1; 

凡在上面是主過濾器,scores.TestID是「分組」 ID,和Count(Eval)是我想要的總數。基本上我的理想輸出是:

 
ID |Count1|Count2|Count3|Count4 
----------------------------------- 
100 |5  |8  |9  |12 
101 |16 |2  |14 |11 

......等等。再次,抱歉,如果這是一個亂七八糟的混亂,希望你可以幫助!

PS。所得到的查詢將從ASP.NET中檢索以綁定到ListView - 如果任何人都可以建議我是否更好地將其作爲存儲過程編寫並查看或將其編碼到ASP中的SQLDataSource中,這將非常感謝:-)

回答

3

您應該能夠使用SUMCASEGROUP BY

SELECT scores.TestID, 
    SUM(CASE WHEN Eval = 1 THEN 1 ELSE 0 END) Count1, 
    SUM(CASE WHEN Eval = 2 THEN 1 ELSE 0 END) Count2, 
    SUM(CASE WHEN Eval = 3 THEN 1 ELSE 0 END) Count3, 
    SUM(CASE WHEN Eval = 4 THEN 1 ELSE 0 END) Count4 
FROM membership 
    INNER JOIN scores 
     ON membership.ID = scores.ClientID 
    INNER JOIN tests ON scores.TestID = tests.TestID 
WHERE membership.GroupID = <MembershipGroup> 
GROUP BY scores.TestID 
+0

哇,這是驚人的,並完美的第一次工作。謝謝先生,你是一位真正的天才! – Katstevens 2013-04-05 02:25:45

+0

@ user2247277 - np,很高興能幫到你! – sgeddes 2013-04-05 02:29:06

1

在思想,你有一個預先定義的一組1-4評價的,我會用case語句中與你的小組合作。

SELECT s.TestId, 
     SUM(CASE WHEN m.Eval = 1 THEN 1 ELSE 0) END AS Count1, 
     SUM(CASE WHEN m.Eval = 2 THEN 1 ELSE 0) END AS Count2, 
     SUM(CASE WHEN m.Eval = 3 THEN 1 ELSE 0) END AS Count3, 
     SUM(CASE WHEN m.Eval = 4 THEN 1 ELSE 0) END AS Count4 
FROM membership m 
    INNER JOIN scores s ON m.ID = s.ClientID 
WHERE m.GroupId = <MembershipGroup> 
GROUP BY s.TestId 

至於問題的另一方面,我個人不使用SQLDataSource對象。此外,將其放入Stored Procedure允許您根據需要修改查詢邏輯,而無需重新編譯。這就是說,僅僅因爲你使用的是存儲過程並不意味着你不能使用SQLDataSource對象。

+0

太好了,斯蒂芬,謝謝。你DataBind()代碼中的每個數據對象,並自己生成SQL檢索?你會推薦使用SqlDataSource嗎?或者那只是你個人的偏好? – Katstevens 2013-04-05 02:28:16

+1

我在代碼中綁定每個對象,並通過SqlClient對象或LINQ類生成SQL檢索。這是我個人的偏好,我推薦它。根據我的經驗,您可以通過在代碼背後執行此操作來使控件和底層SQL執行更多操作。當然,這種體驗會因爲不喜歡使用DataSource對象而感到厭倦和偏見。 – 2013-04-05 04:09:13