在Sql查询中应用Group by的逻辑

时间:2014-03-24 07:03:21

标签: linq sql-server-2008 sql-server-2005

我问的是一个非常初学者的问题,但每当我想使用Group by的聚合函数时,我总是感到困惑。实际上我得到了正确的结果,但我不太确定group by是如何在这里工作的。我的要求是获取基于MessageGroup列的已发送项目的计数。

MessageId    SenderId      MessageGroup                             Message
_____________________________________________________________________________

1                2         67217969-e03d-41ec-863e-659ca26e660f     Hi
2                2         67217969-e03d-41ec-863e-659ca26e660f     Hello
3                2         67217969-e03d-41ec-863e-659ca26e660f     bye
4                1         c45dc414-9320-40a5-8f8f-9c960d6deffe     TC
5                1         8486d16b-294b-45a5-8674-e7024e55f39b     shutup

实际上我想得到已发送消息的计数。其中SenderId = 2已向某人发送了三条消息,但我想显示一个计数,所以我使用了MessageGroup,我正在使用Groupby并获取计数。

我使用过Linq查询::

 return DB.tblMessage.Where(m => m.SenderId == 2 ).GroupBy(m => m.MessageGroup).Count();

这返回“1”,这是正确的,我想在已发送的消息中显示(1)。

但是,如果我尝试在SQL Server中查询上述内容,则返回3

这是我的SQL查询:

select count(*) 
from tblMessage 
where SenderId = 2 
group by MessageGroup

Linq查询是正确的因为它返回了一个微软说here

其实我和Group by混淆了。请明确我的观点。

2 个答案:

答案 0 :(得分:1)

您希望将MessageGroup包含在select中,如下所示:

select MessageGroup, count(*) 
from tblMessage 
where SenderId=2 
group by MessageGroup

答案 1 :(得分:1)

当您使用GroupBy时,Group By Clause组中的任何列都应该在Select Clause中

select MessageGroup,count(MessageGroup)from tblMessage 
where SenderId=2 
group by MessageGroup