SQL Table 使用 CASE T 进行比较 SQL

SQL Table Comparison Using CASE T SQL

我正在尝试编写一个 table 比较查询,当一行中的所有值都不相等时,returns 一个 Pass/Fail 列。我掌握了基本语法,但它是 Passing/Failing 整个数据集,而不是特定的行。不确定我是否需要在某处使用子查询。谢谢!

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

我认为您需要的可以使用普通 SQL 来实现。使用 LEFT JOIN 总是返回带有 TestResult 列的行,该列填充了表明是否找到匹配项的适当值。

如果在两个表中只有一行 TestID = 3 那么结果将是 return 一行。您可以修改 WHERE 子句和声明的变量值以满足您的需要。

正在声明具有值的变量:

DECLARE @TestID INT = 3;

运行比较查询:

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

如果您想比较整个数据集,则可以删除 DECLARE 语句和 WHERE 子句:

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