SQL Server:计算来自两个不同列的对

时间:2017-08-15 11:42:16

标签: sql sql-server

我有一个我需要建立的应用程序的查询,但我很难找到最佳答案。

假设我有一个名为Messages的表,其中包含以下列:

MessageID, From, To, Text

我想计算FromTo之间的所有消息,例如,如果表格如下:

ID From  To   Text
------------------
 1    a   b     hi
 2    b   a  hello
 3    a   c   test

所以基本上我希望结果看起来像

a, b, 2
a, c, 1

感谢您的帮助

2 个答案:

答案 0 :(得分:5)

类似的回答戈登,大约20秒后发布,有一个重要的区别。 ANSI SQL要求GROUP BY子句中不显示派生列。我首先使用CTE来计算最小和最大的对/从对,然后在该CTE上进行聚合查询。在这种情况下,我们最终会对实际的列进行分组。

WITH cte AS (
    SELECT
        CASE WHEN [From] <  [To] THEN [From] ELSE [To] END AS [From],
        CASE WHEN [From] >= [To] THEN [From] ELSE [To] END AS [To]
    FROM yourTable
)

SELECT
    [From], [To], COUNT(*) AS cnt
FROM cte
GROUP BY
    [From], [To]

另请注意,应避免使用From等SQL关键字来命名列和表。要使此查询起作用,您绝对必须将该列用作[From],因为没有括号SQL Server会将其与FROM关键字混淆。

答案 1 :(得分:2)

大多数数据库都有least()greatest(),这使这更容易。在SQL Server中,您可以使用case

select (case when [from] < [to] then [from] else [to] end),
       (case when [from] < [to] then [to] else [from] end),
       count(*)
from t
group by (case when [from] < [to] then [from] else [to] end),
         (case when [from] < [to] then [to] else [from] end);

我会命名列,但我想不出合适的名字。