获取用户的所有联系点的总和

时间:2015-07-06 15:47:33

标签: sql sql-server

我目前获得了以下SQL Server语句,该语句将放在存储过程中:

SELECT [MessagerUserID], [MessagedUserID], sum(1) as CNT
FROM [dbo].[tmpMessaged] T1
group by [MessagerUserID], [MessagedUserID]

我的输出是这样的:

MessagerUserID  MessagedUserID  CNT
4                      1          2
1                      4          2
3                      4          1
4                      5          1

我需要的是用户ID之间所有联系的总和。所以,像这样:

User1        User2        Contact
4              1             4
4              3             1
4              5             1

User1是谁以及谁是User2(至于他们所处的顺序)并不重要,我只需要将上述行组合起来得到2个用户拥有的所有联系人的总和互相拥抱。

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是创建2个新列,更大和更小的用户ID,然后使用+ sum进行分组:

select
  User1,
  User2,
  sum(CNT)
from (
  SELECT 
    case when [MessagerUserID] > [MessagedUserID] 
      then [MessagerUserID] else [MessagedUserID] end as User1,
    case when [MessagerUserID] < [MessagedUserID] 
      then [MessagerUserID] else [MessagedUserID] end as User2,
    CNT
  FROM [dbo].[tmpMessaged] T1
) X
group by User1, User2

您可以在SQL Fiddle

中尝试此操作

答案 1 :(得分:0)

使用case表达式切换MessagerUserID和MessagedUserID的值,以便MessagerUserID始终具有较低的值,然后像往常一样计数和分组。为了便于阅读,我将它包装在一个公用表表达式中:

with cte as (
    select 
       case when MessagerUserID < MessagedUserID 
            then MessagerUserID else MessagedUserID end MessagerUserID, 
       case when MessagerUserID > MessagedUserID 
            then MessagerUserID else MessagedUserID end MessagedUserID
    from tmpMessaged
)

select MessagerUserID, MessagedUserID, count(*) as Contact 
from cte 
group by MessagerUserID, MessagedUserID