2013-04-05 55 views
3

本网站的首次发帖,但过去我已经使用过很多次。我确实试图寻找答案,但无法确定如何正确地设定问题,所以这里就是了。SQL Server将行聚合为列值

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

我需要做的是通过会员组过滤器,记录这个列表,然后创建某种类型列出的输出查询:

  1. 测试ID
  2. 是记录的数量评价,以1
  3. 被评估为2
  4. 被评价为3
  5. 被评估至4
  6. 的记录的数量的记录的数量的记录数

我可以计算出如何分别使用像得到每个评价数的计数:

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中,这将非常感谢:-)

回答

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 
+0

哇,这是惊人的,并完美的第一次工作。谢谢先生,你是一位真正的天才! – Katstevens 2013-04-05 02:25:45

+0

@ user2247277 - np,很高兴能帮到你! – sgeddes 2013-04-05 02:29:06

1

在思想,你有一个预先定义的一组1-4评价的,我会用case语句中与你的小组合作。

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对象。此外,将其放入Stored Procedure允许您根据需要修改查询逻辑,而无需重新编译。这就是说,仅仅因为你使用的是存储过程并不意味着你不能使用SQLDataSource对象。

+0

太好了,斯蒂芬,谢谢。你DataBind()代码中的每个数据对象,并自己生成SQL检索?你会推荐使用SqlDataSource吗?或者那只是你个人的偏好? – Katstevens 2013-04-05 02:28:16

+1

我在代码中绑定每个对象,并通过SqlClient对象或LINQ类生成SQL检索。这是我个人的偏好,我推荐它。根据我的经验,您可以通过在代码背后执行此操作来使控件和底层SQL执行更多操作。当然,这种体验会因为不喜欢使用DataSource对象而感到厌倦和偏见。 – 2013-04-05 04:09:13