我目前获得了以下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个用户拥有的所有联系人的总和互相拥抱。
答案 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