2016-10-06 2 views
0

In SQL Server, habe ich eine Tabelle mit folgenden Daten (tblUserSettings):SQL Server - Vergleichswerte aus derselben Tabelle

| 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  | 

Ich brauche für alle UserTypes von CityID = 20 mit all alle Werte vergleichen die Werte für entsprechende UserTypes von CityID = 3. Die CountryID = 9. Die zu vergleichenden Spalten sind: Value1, Value2, Value3.

Ich muss nur wissen, ob sie alle miteinander übereinstimmen oder nicht. Ich habe versucht, etwas wie folgt zu tun:

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 

Und es gibt mir folgendes Ergebnis, das ich weiter verarbeiten muss, um zu definieren, ob alles übereinstimmt oder nicht.

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

Kann ich tun dies in einer Art und Weise nur eine Spalte zu haben und in der Ausgabe Zeile - nur erhalten entweder 1 für alle Spiele oder 0, wenn mindestens ein nicht übereinstimmt?

+0

was sollte das Ergebnis aussehen? –

Antwort

2

Wenn Sie suchen, nur eine Spalte mit 1 zu erhalten, wenn alle Werte übereinstimmen und 0 wenn atleast man nicht der Fall ist, Verwendung,

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

Ja, genau das suche ich. –

+0

Eigentlich gibt es mir immer noch 4 Zeilen für jeden UserType. Ich änderte diese Abfrage und fügte SUM() vor CASE hinzu, um nur eine Zeile in der Ausgabe zu haben. –

+1

sum() ist nicht erforderlich. Verwenden Sie einfach "distinct". –

0

Wenn Sie alle Städte vergleichen suchen, anstatt nur zwei Sie sollten dies tun können, indem Sie gruppieren statt beitreten.

Etwas wie:

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 
Verwandte Themen