簡體   English   中英

SQL Server將行聚合為列值

[英]SQL Server aggregate rows into column values

這個網站上的第一次帖子,但我過去經常使用它。 我確實試圖尋找一個答案,但無法確定如何正確構建問題,所以這里。

我有一個表,其中每一行的評估編號為1,2,3或4.每行還有一個ID,它是成員資格表的外鍵,另一個ID是與其他數據相關的外鍵。 row(包含測試信息的表)。

我需要做的是按成員資格組過濾此記錄列表,然后創建一個列出以下類型的輸出查詢:

  1. 測試ID
  2. 評估為1的記錄數
  3. 評估為2的記錄數
  4. 評估為3的記錄數
  5. 評估為4的記錄數

我可以找出如何使用以下內容分別獲取每個評估編號的計數:

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;

在上面的主濾波器中,得分.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,將非常感謝:-)

您應該能夠使用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

考慮到你有一組1-4的預定義評估,我會將case語句與你的group一起使用。

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對象。 此外,將其放在存儲過程中允許您根據需要修改查詢邏輯,而無需重新編譯。 也就是說,僅僅因為你使用的是存儲過程並不意味着你不能使用SQLDataSource對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM