日期:2014-05-17  浏览次数:20521 次

这样一个场景要怎样查询呢
本帖最后由 KongHuLu 于 2012-12-12 15:52:49 编辑
http://bbs.csdn.net/topics/390313485?page=1#post-393183709
问题的前半部分发在这个帖子中,已经得到解决。本以为自己可以搞定剩下的部分,但是。。。
想过之后对自己的SQL能力产生了质疑,因为觉得肯定要用存储过程,借助临时表。所以接着来求助大家有没有更好的办法。

完整的场景就是
Message表中有字段 ID FromID ToID
比如现在有数据是
ID         FromID         ToID     IsNew
1          103            102      true
2          102            103      false
3          103            102      true
4          104            102      true
5          105            102      true

from代表发送方,to代表接收方。
按发送方和接收方捆绑分组,比如参与者是103和102的时候,不管103发给102,还是102发给103都算是这一组的,然后取出每组最近的一条。
上面的已经在那个帖子结果了,后续的是,需要取出两个统计字段,一个是统计一组中共有多少条数据,一个是统计一组中有多少条新数据(用IsNew字段标识的)。
按照如上模拟数据的话,取出来的应该是
ID         FromID         ToID     AllCount   NewCount
1          103            102      3          2

4          104            102      1          1
5          105            102      1          1
------解决方案--------------------
自己多思考,多学习,不要老想别人给你答案
------解决方案--------------------
declare @message table(id int,fromid int,toid int,isnew int)
insert into @message
select 1  ,        103     ,    102,1 union all
select  2   ,      102      ,       103,0  union all
select 3    ,      103      ,       102,1  union all
select 4   ,       104    ,         102,1  union all
select 5  ,       105      ,       102,1
;
with tb as(
select id,fromid,toid,isnew,
case when fromid<toid