【问题标题】:USING CASE WHEN in either WHERE or JOIN在 WHERE 或 JOIN 中使用 CASE
【发布时间】:2014-04-04 11:07:33
【问题描述】:
SELECT Pod_Code, COUNT(*)

FROM [DBHFT 201314 Trust SLAM Model PID].dbo.D_Actual_Activity_HRG A

INNER JOIN dbo.D_HrgCodes B ON A.HRG_ID = B.Hrg_ID

INNER JOIN dbo.D_PodAll C ON A.Pod_ID = C.Pod_ID

INNER JOIN dbo.D_SpecCodes D On A.Spec_ID = D.Spec_ID

INNER JOIN dbo.D_GppCodes E ON A.Gpp_ID = E.Gpp_ID

LEFT JOIN dbo.D_CalcResults_ReportMasterIDs F ON A.ReportMasterID = F.ReportMaster_ID

LEFT JOIN dbo.D_CalcResultsMain G ON F.RM_ID = G.RM_ID 

AND A.MonthNo = G.Month 

AND A.Spec_ID = G.Spec_ID 

AND A.Pod_ID = G.POD_ID 

AND A.Hrg_ID = G.HRG_ID 

WHERE G.Category_Type = 0

AND (Activity_Actual <>0 OR Price_Actual <>0)

AND CASE WHEN
    (Pod_Code = 'DI' THEN A.SpellAdmissionDate = G.SpellAdmissionDate) END

GROUP BY Pod_Code

ORDER BY Pod_Code;

嗨,

我已经编写了上面的代码,并尝试在WHEREJOIN 区域中使用我的CASE WHEN 语句,但没有任何乐趣。我想要实现的是,当 POD 代码DI 时,还链接仅具有相同录取日期的数据,因为目前这些行正在重复.问题是我不能只链接这个字段,因为不是每一行都有一个录取日期,所以它会导致输出问题。到目前为止,我已经在该网站上阅读了各种解决方案,并试图将它们调整到这种情况下,但没有任何乐趣(运行失败或错误消息等)。任何帮助将不胜感激。

问候, 锡

【问题讨论】:

  • 这是一个简化的例子还是你真的只想数数?那为什么要加入所有这些表呢?

标签: sql sql-server-2008 join case


【解决方案1】:

这可以用一个简单的 OR 子句来表达:

AND (A.SpellAdmissionDate = G.SpellAdmissionDate OR Pod_Code != 'DI' OR Pod_Code IS NULL)

如果 Pod_Code 不可为空,那么这将简化为:

AND (A.SpellAdmissionDate = G.SpellAdmissionDate OR Pod_Code != 'DI')

【讨论】:

  • 太棒了,顶部的一些其他列不像链接之前那样加起来,但底部的效果很好。
  • Pod_Code 来自哪个表?请注意,外部连接记录具有 NULL 值列。例如,对于外部连接的 G 记录,您的行 WHERE G.Category_Type = 0 永远不会为真,因此您的外部连接变为内部连接。
【解决方案2】:

请参阅下面的 WHERE 子句中使用 CASE 语句的正确语法

AND 
  A.SpellAdmissionDate= CASE WHENPod_Code = 'DI' THEN  G.SpellAdmissionDate END

【讨论】:

  • 效果很好。非常感谢您的帮助!
猜你喜欢
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 2010-11-04
相关资源
最近更新 更多