2016-03-20 19 views
1

Bir satırdaki tüm değerler eşit olmadığında bir Geçiş/Hata sütunu döndüren bir tablo karşılaştırması sorgusu yazmayı deniyorum. Temel sözdizim var, ancak belirli satırlar değil, tüm veri kümesinin Geçirilmesi/Başarısız Olması. Bir yerde bir alt sorgu kullanmam gerekip gerekmediğinden emin değilim. Teşekkürler!SQL Tablosu Karşılaştırması CASE T SQL Kullanılıyor

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

Mantığınız hakkında biraz bilgi verir misiniz? John Smith'in neden geçmesi bekleniyor ve diğer ikisi başarısız mı? – Mureinik

+0

Sorun değil, teşekkürler. John Smith, ExpectedResults ve Fiili sonuçlarda döndürülen değerler = olduğu için geçer. Diğer iki satır değil. Şu anda baktığımızda, 3 testin tümünü çalıştırmaya çalıştığımda TestID'nin 3 olarak ayarlanmış olması bir şey olabilir. – AndrewC10

cevap

1

İhtiyacınız olan şey basit SQL kullanarak elde edilebilir düşünüyorum. Satırı her zaman bir eşleşmenin bulunup bulunmadığını belirten uygun değerle doldurulmuş TestResult sütun ile geri almak için LEFT JOIN kullanın.

Her iki tabloda da TestID = 3 numaralı bir satır varsa, sonuç bir satır döndürür. İhtiyaçlarınızı karşılamak için WHERE maddesini ve beyan edilen değişken değerini değiştirebilirsiniz. Karşılaştırma sorguyu çalıştırma

DECLARE @TestID INT = 3; 

: bir değerle değişken bildirme

tamamını veri kümesini karşılaştırmak isterseniz

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 

o zaman bir WHERE maddesi ile birlikte DECLARE deyimi bırakın :

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

Bu, ancak sadece 3 TestID değerini döndürür. TestID 1 ve 2 ile 3 satırlık sınama/veri döndürmek isteseydim, bu mümkün olabilir mi? Teşekkürler – AndrewC10

+0

Cevabımda söylediğim gibi, "WHERE" koşulunu kaldırın. Bunu yaparsanız, bildirilen değişkene de ihtiyacınız olmayacaktır. Tüm ActualResults' tablonun tamamını tarar. –

+0

Sadece bu parçayı çok gördüm, mükemmel çalışıyor! – AndrewC10