第一次在这个网站上发帖,但我过去经常使用它。我确实尝试过寻找这个问题的答案,但无法确定如何正确地构建问题,所以就开始吧。
我有一个表,其中每一行的评估编号为 1、2、3 或 4。每一行还有一个 ID,它是成员表的外键,另一个 ID 是其他数据的外键与行相关(保存测试信息的表)。
我需要做的是按成员组过滤此记录列表,然后创建某种类型的输出查询,其中列出:
- 测试编号
- 评估为 1 的记录数
- 评估为 2 的记录数
- 评估为 3 的记录数
- 评估为 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 中,将不胜感激:-)
最佳答案
您应该能够使用SUM
、CASE
和GROUP 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/