【问题标题】:SQL Case for 2 values lookup2 值查找的 SQL 案例
【发布时间】:2017-04-18 13:13:55
【问题描述】:

我正在尝试使用 Case 语句来查找表格,如果表格显示阶段 06 和阶段 11,那么如果只显示阶段 06,则认为这是已修改的,那么这不是修改。

我当前的代码是:

DECLARE

@DATE1 DATETIME = '04/01/2017',
@DATE2 DATETIME = '04/30/2017',
@RAISEDBY VARCHAR (10) = 'CAROLIND'

SELECT DISTINCT

J.[RAISED-BY],
J.[JOB-NO],
J.[JOB-STATUS],
J.[DATE-LOGGED],
J.[CURRENT-STAGE-CODE],
J.[ORIG-LOGGED-VALUE] AS "LOGGED-VALUE",
J.[TOTAL-VALUE],
J.[SHORT-DESCRIPTION],
J.[CONTRACTOR],
C.[DESCRIPTION],
CASE 
    WHEN SH.[STAGE-CODE] = '06' AND SH.[STAGE-CODE] = '11' THEN 'YES'
    ELSE 'NO'
    END AS "AMENDED"

FROM

DBO.[JOB] AS J
LEFT OUTER JOIN
DBO.[CONT] as C ON C.CONTRACTOR = J.CONTRACTOR
LEFT OUTER JOIN
DBO.[JOB-STAGE-HISTORY] AS SH ON SH.[JOB-NO] = J.[JOB-NO]

WHERE

J.[DATE-LOGGED] BETWEEN @DATE1 AND @DATE2
AND
J.[RAISED-BY] = @RAISEDBY
AND
SH.[JOB-NO] = 'W0423540'

ORDER BY

J.[RAISED-BY],
J.[JOB-NO]

当它为“YES”时,此查询当前返回“NO”,因为 Job Stage History 表中有 06 和 11 行。

谢谢

查询结果

工作阶段历史表

【问题讨论】:

  • 这是一个 case 表达式,而不是 case 语句。 (它返回一个值。)
  • 您是否正在寻找行的值是 06 以及 11?它将按行选择。你是说OR吗?
  • 如果 06 和 11 存在,这应该返回单行修正 = 是,如果只有 06 存在则返回单行修正 = 否
  • 我建议(1)简化查询和问题; (2) 在问题中提供样本数据和期望的结果。
  • @TheWeblord2000 如果您在问题中包含所需的结果会更好。

标签: sql sql-server tsql case


【解决方案1】:

不确定以下是否会为您获取结果。

修改/添加加入条件如下。

LEFT OUTER JOIN
DBO.[JOB-STAGE-HISTORY] AS SH ON SH.[JOB-NO] = J.[JOB-NO]
and sh.[STAGE-CODE] = 06

left outer join
dbo.[JOB-STAGE-HISTORY] AS SH1 on SH1.[JOB-NO] = SH.[JOB-NO]
and SH1.[STAGE-CODE] = 11

添加连接条件后,更改case语句如下。

CASE 
    WHEN SH1.[STAGE-CODE] is null then 'No' else 'Yes' end.

答案基于对您的问题所做的假设。

【讨论】:

    【解决方案2】:

    您的CASE 正在检查记录中的单个字段是否等于两个不同的值,这总是错误的。您想要检查JOB-STAGE-HISTORY 表中是否存在两个不同的行(一个 06 行和一个 11 行)。尝试用这个替换CASE

    case when (select count(distinct j.[STAGE-CODE]) 
               from [JOB-STAGE-HISTORY] j 
               where j.[JOB-NO] = sh.[JOB-NO] 
               and j.[STAGE-CODE] in ('06','11')) = 2 
    then 'YES' else 'NO' end AMENDED
    

    【讨论】:

      【解决方案3】:

      提供的两个答案都很好,这要感谢他们的参与。我花了更多时间研究这个挑战,并相信这可能是另一种解决方法:

      SELECT DISTINCT
      
      J.[RAISED-BY],
      J.[JOB-NO],
      J.[JOB-STATUS],
      J.[DATE-LOGGED],
      J.[CURRENT-STAGE-CODE],
      J.[ORIG-LOGGED-VALUE] AS "LOGGED-VALUE",
      J.[TOTAL-VALUE],
      J.[SHORT-DESCRIPTION],
      J.[CONTRACTOR],
      C.[DESCRIPTION],
      SH.[JOB-AMENDED]
      
      FROM
      
      DBO.[JOB] AS J
      LEFT OUTER JOIN
      DBO.[CONT] as C ON C.CONTRACTOR = J.CONTRACTOR
      RIGHT OUTER JOIN
      (SELECT 
             [JOB-NO], 
             CASE WHEN MAX([STAGE-CODE]) = ('11') THEN 'YES' ELSE 'NO' END AS "JOB-AMENDED"
      FROM
      DBO.[JOB-STAGE-HISTORY] 
      WHERE [STAGE-CODE] IN ('06','11')
      GROUP BY [JOB-NO]) AS SH ON J.[JOB-NO] = SH.[JOB-NO] 
      
      WHERE
      
      J.[DATE-LOGGED] BETWEEN @DATE1 AND @DATE2
      AND
      J.[RAISED-BY] = @RAISEDBY
      

      它肯定会给出所需的结果以及提供的其他答案。

      【讨论】:

      • 你确定这行得通吗?即使没有“06”记录,它似乎也会给出“YES”。
      • 是的,因为在我们的数据上“是”实际上只需要“第 11 阶段”,因此通过执行 Max 来查找它是否存在于 (6/11) 之外,然后如果最大只有 6,那么这是“否”
      猜你喜欢
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多