SQL Server将行聚合为列值

时间:2013-04-05 01:39:31

标签: asp.net sql sql-server

首次在本网站发帖,但我过去经常使用它。我确实试图寻找答案,但无法确定如何正确构建问题,所以这里就是这样。

我有一个表,其中每一行的评估编号为1,2,3或4.每行还有一个ID,它是成员资格表的外键,另一个ID是其他数据的外键。与行相关(包含测试信息的表)。

我需要做的是按成员资格组过滤此记录列表,然后创建一个列出的某种类型的输出查询:

  1. 测试ID
  2. 评估为1
  3. 的记录数
  4. 评估为2
  5. 的记录数
  6. 评估为3
  7. 的记录数
  8. 评估为4
  9. 的记录数

    我可以通过以下方式找出如何分别计算每个评估编号:

    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是&#39;分组&#39; ID和Count(Eval)是我想要的聚合。基本上我理想的输出是:

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

    ......等等。再次,对不起,如果这是一个混乱的混乱,希望你很多可以帮助!

    PS。生成的查询将从ASP.NET检索以绑定到ListView - 如果有人可以建议我是否最好将其作为存储过程编写并查找或编写它到ASP中的SQLDataSource,将非常感谢: - )

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

考虑到您有一组预定义的1-4评估,我会将案例陈述与您的小组一起使用。

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对象。