Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TSQL查找通信的数量_Sql_Sql Server_Tsql - Fatal编程技术网

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条?每次对话看一条记录期望的结果是什么?每次对话只看一条记录,或每次对话看两条?一条记录