这样一个场景要怎样查询呢

潮起潮落 2012-12-12 03:41:21
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
...全文
165 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
潮起潮落 2012-12-12
  • 打赏
  • 举报
回复
关键在CASE...WHEN 3L的ISNew设置为可sum的值替代了一个count 万分感谢两位的帮助,还有1L的善言,结合MSDN我再学习一下。
snbxp 2012-12-12
  • 打赏
  • 举报
回复

CREATE TABLE test1 (ID INT, FromID INT, ToID INT, IsNew VARCHAR(20))
INSERT INTO test1 
SELECT 1,103,  102,'true'  UNION ALL
SELECT 2,102,  103,'false'  UNION ALL
SELECT 3,103,  102,'true'  UNION ALL
SELECT 4,104,  102,'true'  UNION ALL
SELECT 5,105,  102,'true' 


SELECT 
Min(ID) ID,
CASE WHEN FromID>=ToID THEN FromID ELSE ToID END FromID,
CASE WHEN FromID<ToID THEN FromID ELSE ToID END ToID,
COUNT(1) AllCount,
COUNT(CASE WHEN IsNew='true' THEN 1 ELSE NULL END) NewCount
FROM TEST1
GROUP BY 
CASE WHEN FromID>=ToID THEN FromID ELSE ToID END, 
CASE WHEN FromID<ToID THEN FromID ELSE ToID END 
------------------
ID          FromID      ToID        AllCount    NewCount
----------- ----------- ----------- ----------- -----------
1           103         102         3           2
4           104         102         1           1
5           105         102         1           1
开启时代 2012-12-12
  • 打赏
  • 举报
回复
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 then fromid else toid end as newfromid, case when fromid<toid then toid else fromid end as newtoid from @message ) select b.id,c.fromid,c.toid,b.allcount,b.newcount from ( select MIN(id) id,COUNT(1) allcount,SUM(isnew) as newcount from ( select id,fromid,toid,isnew,dense_rank() over(order by newfromid,newtoid) as rowid from tb) as a group by rowid) as b inner join tb as c on b.id=c.id
潮起潮落 2012-12-12
  • 打赏
  • 举报
回复
引用 1 楼 yangsh0722 的回复:
自己多思考,多学习,不要老想别人给你答案
说得很对,我也一边在想怎么解决。 在原语句的基础上修改没有得到想要的结果,因为这里有区别于传统的group by col1,col2,怎么说呢,从意思上来说大概相当于group by col1,col2 or col2,col1 所以我目前想到的是先读取不带统计字段的存入临时表中,然后游标遍历读取每组对应的两个统计字段。 只是觉得繁琐。
-Tracy-McGrady- 2012-12-12
  • 打赏
  • 举报
回复
自己多思考,多学习,不要老想别人给你答案

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧