TSQL查找通信的数量
我有下表:TSQL查找通信的数量,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有下表: SenderName ReceiverName NumberOfTime Ajay Vijay 1 Anthony Mark 3 Anthony John 5 David Mark 2 David John 5 David John 3
SenderName ReceiverName NumberOfTime
Ajay Vijay 1
Anthony Mark 3
Anthony John 5
David Mark 2
David John 5
David John 3
David John 1
John David 2
John David 2
John Anthony 5
Mark Anthony 1
测试数据:
CREATE TABLE [dbo].[tblMyTempTable](
[SenderName] [varchar](20) NULL,
[ReceiverName] [varchar](10) NULL,
[NumberOfTime] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[tblMyTempTable]
([SenderName], [ReceiverName], [NumberOfTime])
VALUES
(N'David', N'John', 1)
,(N'Mark', N'Anthony', 1)
,(N'Ajay', N'Vijay', 1)
,(N'John', N'David', 2)
,(N'Anthony', N'Mark', 3)
,(N'David', N'John', 5)
,(N'David', N'John', 3)
,(N'John', N'David', 2)
,(N'David', N'Mark', 2)
,(N'John', N'Anthony', 5)
,(N'Anthony', N'John', 5)
我需要找出每一对之间的通信次数。例如,Anthony联系了John 5次,John联系了Anthony 5次。所以约翰和安东尼之间的通信量是10倍
同样,大卫总共联系了约翰9次,约翰联系了大卫4次。所以总数是13。我已经尝试了很多方法,包括使用子字符串交换列、repalce等。我想知道是否有人有有趣的方法来实现想要的结果。提前感谢。将最小的名称放入一列,将较大的名称放入另一列,这样您就可以为每一对进行聚合
select
case when sender_name<receiver_name then sender_name else receiver_name end as name1,
case when sender_name>receiver_name then sender_name else receiver_name end as name2,
sum(numberoftime)
from t
group by case when sender_name<receiver_name then sender_name else receiver_name end,
case when sender_name>receiver_name then sender_name else receiver_name end
将最小的名称放入一列,将较大的名称放入另一列,这样就可以为每一对进行聚合
select
case when sender_name<receiver_name then sender_name else receiver_name end as name1,
case when sender_name>receiver_name then sender_name else receiver_name end as name2,
sum(numberoftime)
from t
group by case when sender_name<receiver_name then sender_name else receiver_name end,
case when sender_name>receiver_name then sender_name else receiver_name end
您可以使用如下查询:
;WITH CTE AS (
SELECT IIF(SenderName < ReceiverName, SenderName, ReceiverName) AS first_name,
IIF(SenderName >= ReceiverName, SenderName, ReceiverName) AS second_name,
NumberOfTime
FROM tblMyTempTable
)
SELECT first_name, second_name, SUM(NumberOfTime) AS total_times
FROM CTE
GROUP BY first_name, second_name
查询使用一个CTE,该CTE包含一个表的版本,其中SenderName和ReceiverName按字母顺序进行选择
您可以使用如下查询:
;WITH CTE AS (
SELECT IIF(SenderName < ReceiverName, SenderName, ReceiverName) AS first_name,
IIF(SenderName >= ReceiverName, SenderName, ReceiverName) AS second_name,
NumberOfTime
FROM tblMyTempTable
)
SELECT first_name, second_name, SUM(NumberOfTime) AS total_times
FROM CTE
GROUP BY first_name, second_name
查询使用一个CTE,该CTE包含一个表的版本,其中SenderName和ReceiverName按字母顺序进行选择
使用子查询(而不是CTE)对其他答案的细微变化:
SELECT
LowName, HighName, SUM(NumberOfTime) TotalNumberOfTime
FROM
(
SELECT
CASE
WHEN SenderName < ReceiverName THEN SenderName
ELSE ReceiverName
END LowName,
CASE
WHEN SenderName > ReceiverName THEN SenderName
ELSE ReceiverName
END HighName,
NumberOfTime
FROM
tblMyTempTable
) tblMyTempTableWithSortedNames
GROUP BY
LowName, HighName
使用子查询(而不是CTE)对其他答案的细微变化:
SELECT
LowName, HighName, SUM(NumberOfTime) TotalNumberOfTime
FROM
(
SELECT
CASE
WHEN SenderName < ReceiverName THEN SenderName
ELSE ReceiverName
END LowName,
CASE
WHEN SenderName > ReceiverName THEN SenderName
ELSE ReceiverName
END HighName,
NumberOfTime
FROM
tblMyTempTable
) tblMyTempTableWithSortedNames
GROUP BY
LowName, HighName
期望的结果是什么?每次对话只看一条记录或2条?每次对话看一条记录期望的结果是什么?每次对话只看一条记录,或每次对话看两条?一条记录