2017-08-15 6 views
0

ビルドしているアプリケーションに必要なクエリがありますが、最適な答えを見つけるのに苦労しています。SQL Server:2つの異なる列から数えます。

私は次の列で、Messagesという名前のテーブルがあるとします。

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

MessageID, From, To, Text 

私は、テーブルはこのように見える場合Fromと、その結果としてTo間のすべてのメッセージをカウントします

基本的に私は結果を欲しいと思う。

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秒後に掲載され、重要な違いが1つあります。 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キーワードでそれを混同します。

+0

完全に動作します、あなたの完全な説明をありがとう、ありがとう! – Chen

関連する問題