2016-03-20 10 views
1

Ich versuche eine Tabellenvergleichsabfrage zu schreiben, die eine Pass/Fail-Spalte zurückgibt, wenn alle Werte innerhalb einer Zeile nicht gleich sind. Ich habe die grundlegende Syntax, aber es ist das Bestehen/Nichtbestehen des gesamten Datensatzes, nicht die spezifischen Reihen. Nicht sicher, ob ich irgendwo eine Unterabfrage verwenden muss. Vielen Dank!SQL-Tabellenvergleich mit CASE T SQL

Actual Output: 
TestID LastName FirstName PrimaryLevel Result 
1   Smith  John   1   Fail 
2   Jones  Adam   2   Fail 
3   Barker  Bob   3   Fail 

Expected Output: 
TestID LastName FirstName PrimaryLevel Result 
1   Smith  John   1   Pass 
2   Jones  Adam   2   Fail 
3   Barker  Bob   3   Fail 

--Code: 
declare @TestID int 

declare @TestIDExpected varchar(max) 
declare @LastNameExpected varchar(max) 
declare @FirstNameExpected varchar(max) 
declare @PrimaryLevelExpected varchar(max) 

declare @TestIDActual varchar(max) 
declare @LastNameActual varchar(max) 
declare @FirstNameActual varchar(max) 
declare @PrimaryLevelActual varchar(max) 

set @TestID = 3 

set @TestIDExpected = (select TestID from ExpectedResults where TestID = @TestID) 
set @LastNameExpected = (select LastName from ExpectedResults where TestID = @TestID) 
set @FirstNameExpected = (select FirstName from ExpectedResults where TestID = @TestID) 
set @PrimaryLevelExpected = (select PrimaryLevel from ExpectedResults where TestID = @TestID) 

set @TestIDActual = (select TestID from ActualResults where TestID = @TestID) 
set @LastNameActual = (select LastName from ActualResults where TestID = @TestID) 
set @FirstNameActual = (select FirstName from ActualResults where TestID = @TestID) 
set @PrimaryLevelActual = (select PrimaryLevel from ActualResults where TestID = @TestID) 

select TestID, LastName, FirstName, PrimaryLevel, 
    case 
    when @TestIDExpected = @TestIDActual and @LastNameExpected = @LastNameActual and @FirstNameExpected = @FirstNameActual and @PrimaryLevelExpected = @PrimaryLevelActual then 'Pass' 
    else 'Fail' 
    END as Result from ActualResults 
+0

Können Sie bitte etwas über Ihre Logik ausarbeiten? Warum wird John Smith erwartet und die anderen beiden scheitern? – Mureinik

+0

Kein Problem, danke. John Smith wird übergeben, da alle zurückgegebenen Werte in ExpectedResults und Actual-Ergebnissen = sind. Die anderen zwei Zeilen sind nicht. Wenn ich es jetzt ansehe, kann es sein, dass TestID auf 3 gesetzt ist, wenn ich versuche, alle 3 Tests durchzuführen. – AndrewC10

Antwort

1

Ich denke, was Sie brauchen, kann mit Hilfe von Plain SQL erreicht werden. Verwenden Sie LEFT JOIN, um die Zeile immer mit einer TestResult-Spalte zurückzubekommen, die mit einem entsprechenden Wert gefüllt ist, der angibt, ob eine Übereinstimmung gefunden wurde oder nicht.

Wenn Sie nur eine Zeile in beiden Tabellen mit TestID = 3 haben, wird das Ergebnis eine Zeile zurückgeben. Sie können die WHERE-Klausel und Ihren deklarierten Variablenwert ändern, um Ihre Anforderungen zu erfüllen.

Deklarieren Variable mit einem Wert:

DECLARE @TestID INT = 3; 

den Vergleich Abfrage ausgeführt wird:

SELECT 
    a.TestID 
    , a.LastName 
    , a.FirstName 
    , a.PrimaryLevel 
    , CASE WHEN b.TestID IS NOT NULL THEN 'Pass' ELSE 'Fail END AS TestResult 
FROM 
    ActualResults a 
    LEFT JOIN ExpectedResults b ON 
    a.TestID = b.TestID 
    AND a.LastName = b.LastName 
    AND a.FirstName = b.FirstName 
    AND a.PrimaryLevel = b.PrimaryLevel 
WHERE 
    a.TestID = @TestID 

Wenn Sie dann gesamten Datensatz vergleichen möchten, können Sie die DECLARE Anweisung zusammen mit einer WHERE Klausel fallen :

SELECT 
    a.TestID 
    , a.LastName 
    , a.FirstName 
    , a.PrimaryLevel 
    , CASE WHEN b.TestID IS NOT NULL THEN 'Pass' ELSE 'Fail END AS TestResult 
FROM 
    ActualResults a 
    LEFT JOIN ExpectedResults b ON 
    a.TestID = b.TestID 
    AND a.LastName = b.LastName 
    AND a.FirstName = b.FirstName 
    AND a.PrimaryLevel = b.PrimaryLevel 
+0

Das funktioniert, aber gibt nur TestID von 3 zurück. Wenn ich 3 Reihen von Tests/Daten mit TestID 1 und 2 zurückgeben wollte, wäre das möglich? Danke – AndrewC10

+0

Wie ich in meiner Antwort sagte, entfernen Sie den 'WHERE' Zustand. Wenn Sie das tun, brauchen Sie auch die deklarierte Variable nicht. Es wird die gesamte Tabelle 'ActualResults' gescannt. –

+0

Habe diesen Teil gesehen, vielen Dank, funktioniert perfekt! – AndrewC10