3

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

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

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

  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;

上面是主过滤器,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 中,将不胜感激:-)

4

2 回答 2

3

您应该能够使用SUM,CASEGROUP 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
于 2013-04-05T01:49:26.650 回答
1

考虑到您有一组预定义的 1-4 评估,我将使用案例语句与您的 group by 结合使用。

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

于 2013-04-05T01:49:33.040 回答