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
我正在尝试编写一个 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