2017-08-15 75 views
0

我有一个查询需要我正在构建的应用程序,但我正在努力寻找最佳答案。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

大多数数据库有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); 

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

5

Gordon的相似答案约20秒后发布,只有一个重要区别。 ANSI SQL要求在GROUP BY子句中不出现派生列。我首先使用一个CTE来计算to/from对的最小值和最大值,然后在该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] 

还要注意的是,你应该避免使用SQL关键字,如From来命名列和表。为了使这个查询起作用,你绝对必须使用该列作为[From],因为没有括号,SQL Server会将其与FROM关键字混淆。

+0

完美地工作,感谢您的详细解释,非常感谢! – Chen

相关问题