2017-08-15 108 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

相關問題