2016-10-06 33 views
0

から値を比較し、私は次のようなデータ(tblUserSettings)で一つのテーブルを持っている:SQL Serverは - SQL Server内の同じテーブル

| CountryID | CityID | UserType | Value1 | Value2 | Value3 | 
| 9   | 3  | 1  | 5  | 5  | 5  | 
| 9   | 3  | 2  | NULL | NULL | NULL | 
| 9   | 3  | 3  | 5  | 5  | 5  | 
| 9   | 3  | 4  | 5  | 5  | 5  | 
| 9   | 20  | 1  | 5  | 5  | 5  | 
| 9   | 20  | 2  | NULL | NULL | NULL | 
| 9   | 20  | 3  | 5  | 5  | 5  | 
| 9   | 20  | 4  | 0  | 0  | 0  | 

私がすべてとCityID = 20からのすべてのUserTypesのすべての値を比較する必要がありますCityID = 3の対応するUserTypeの値。CountryID = 9。比較する列は、Value1、Value2、Value3です。

すべてが一致しているかどうかを知る必要があります。

SELECT CASE WHEN ISNULL(t1.Value1, 0) = ISNULL(t2.Value1, 0) THEN 1 ELSE 0 END AS Match1, 
     CASE WHEN ISNULL(t1.Value2, 0) = ISNULL(t2.Value2, 0) THEN 1 ELSE 0 END AS Match2, 
     CASE WHEN ISNULL(t1.Value3, 0) = ISNULL(t2.Value3, 0) THEN 1 ELSE 0 END AS Match3 
FROM tblUserSettings t1 
INNER JOIN tblUserSettings t2 ON t1.CountryID = t2.CountryID 
      AND t1.UserType = t2.UserType 
      AND t1.CityID = 3 
      AND t2.CityID = 20 
WHERE t1.CountryID = 9 

そしてそれは、私はすべてが一致するかどう定義するためにさらに処理する必要があり、結果、次の私を与える:私は次のように何かをしようとしました。少なくとも一つが一致しない場合だけですべての一致のための1または0のいずれかを受け取る -

| Match1 | Match2 | Match3 | 
| 1  | 1  | 1  | 
| 1  | 1  | 1  | 
| 1  | 1  | 1  | 
| 0  | 0  | 0  | 

は、私は、出力で唯一の列と行を持つ方法でこれを行うことができますか?

+0

? –

答えて

2

あなたは少なくとも1つでない場合、すべての値が一致し10と1つの列のみを取得するために探している場合は、使用、

SELECT 
CASE WHEN ISNULL(t1.Value1, 0) = ISNULL(t2.Value1, 0) 
     AND ISNULL(t1.Value2, 0) = ISNULL(t2.Value2, 0) 
     AND ISNULL(t1.Value3, 0) = ISNULL(t2.Value3, 0) 
THEN 1 ELSE 0 END AS Match 
FROM tblUserSettings t1 
INNER JOIN tblUserSettings t2 ON t1.CountryID = t2.CountryID 
      AND t1.UserType = t2.UserType 
      AND t1.CityID = 3 
      AND t2.CityID = 20 
WHERE t1.CountryID = 9 
+0

はい、それは私が探しているものです。 –

+0

実際には、各UserTypeに対して4つの行が表示されます。このクエリを修正し、CASEの前にSUM()を追加して、出力に1行しか持たないようにしました。 –

+1

sum()は必須ではありません。ちょうど 'distinct'を使用してください。 –

0

あなたはむしろちょうど2つ以上のすべての都市を比較するために探している場合あなたは参加するよりもむしろグループ化することでこれを行うことができます。

ような何か:結果がどのように見えるか

SELECT 
CASE WHEN 
     max(Value1)-min(Value1) = 0 
     AND max(Value2)-min(Value2) = 0 
     AND max(Value3)-min(Value3) = 0 
THEN 1 ELSE 0 AS Match 
FROM tblUserSettings 
GROUP BY CountryID,UserType 
関連する問題