【问题标题】:SQL Table Comparison Using CASE T SQL使用 CASE T SQL 的 SQL 表比较
【发布时间】:2016-03-20 17:25:58
【问题描述】:

我正在尝试编写一个表比较查询,当一行中的所有值都不相等时,该查询返回 Pass/Fail 列。我有基本的语法,但它是传递/失败整个数据集,而不是特定的行。不确定我是否需要在某处使用子查询。谢谢!

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

【问题讨论】:

  • 您能详细说明一下您的逻辑吗?为什么预计约翰史密斯会通过而其他两个失败?
  • 没问题,谢谢。 John Smith 将通过,因为 ExpectedResults 和 Actual results 中的所有返回值都是 =。其他两行不是。现在看,当我尝试运行所有 3 个测试时,可能是 TestID 设置为 3。

标签: sql sql-server comparison case-when


【解决方案1】:

我认为您需要的可以使用纯 SQL 来实现。使用LEFT JOIN 始终使用TestResult 列返回行,该列填充适当的值,指示是否找到匹配项。

如果您在两个表中只有一行带有TestID = 3,那么结果将返回一行。您可以修改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

【讨论】:

  • 这可行,但只返回 3 的 TestID。如果我想返回 3 行 TestID 1 和 2 的测试/数据,这可能吗?谢谢
  • 正如我在回答中所说,删除WHERE 条件。如果你这样做,你也不需要声明的变量。它将扫描整个ActualResults 表。
猜你喜欢
  • 2010-09-25
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
相关资源
最近更新 更多