我有一个我需要建立的应用程序的查询,但我很难找到最佳答案。
假设我有一个名为Messages
的表,其中包含以下列:
MessageID, From, To, Text
我想计算From
和To
之间的所有消息,例如,如果表格如下:
ID From To Text
------------------
1 a b hi
2 b a hello
3 a c test
所以基本上我希望结果看起来像
a, b, 2
a, c, 1
感谢您的帮助
答案 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);
我会命名列,但我想不出合适的名字。