asp.net - SQL Server 将行聚合为列值

标签 asp.net sql sql-server

第一次在这个网站上发帖,但我过去经常使用它。我确实尝试过寻找这个问题的答案,但无法确定如何正确地构建问题,所以就开始吧。

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

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

  1. 测试编号
  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;

上面是主要过滤器,scores.TestID 是'分组'ID,Count(Eval) 是我想要的聚合。基本上我理想的输出是:

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

...等等。再次抱歉,如果这是一团乱码,希望你们能帮上忙!

附言。结果查询将从 ASP.NET 中检索以绑定(bind)到 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

关于asp.net - SQL Server 将行聚合为列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15824540/

相关文章:

javascript - 如何使用 Bootstrap(C#、VS 2013)从 CodeFile 调用方法

用于使用 OR 进行查询的 mysql 索引用法

sql - 查找同一个人的最新约会日期

sql-server - 使用 EXCEPT 组合数据集与在 LEFT JOIN 中检查 IS NULL

sql - 如何仅在 SQL Server 中选择未提交的行?

asp.net - ASP Core Azure Active Directory 登录使用角色

ASP.NET 网络表单 : set cookie using jQuery on the OnSelectedIndexChanged event

c# - javascript 和 c# 中的传递参数问题

sql - 如何强制 SQLAlchemy 包含重复的列?

sql - 检查 varbinary(max) 列是否为 null 真的很慢