【问题标题】:CASE - WHEN When joining tablesCASE - WHEN 连接表时
【发布时间】:2013-01-16 20:54:44
【问题描述】:

我有 2 张桌子:

AppDetailFee table has AppID (PK), TypeID, Amount
AppDetail table has AppID (PK)   

我在 AppID 上加入了两个表,我需要检查以下内容的 TypeID 和数量。有3种情况:

If TypeID = 6 and Amount = 0 then  print appid and amount zero
If typeID = 6 and amount <> 0  - bypass and do not print
When TypeID <> 6 then print zero

下面是我使用的代码,但是我得到了所有不等于零且数量为零的行的结果。

任何帮助将不胜感激。 谢谢

SELECT  ad.AppID
      , MAX(case when (adf.TypeID = 6 AND adf.Amount = 0) then 0 
                 when (adf.TypeID = 6 AND adf.Amount <> 0) then Adf.Amount
       ELSE 0 END) AS FeeAmount

FROM         
      AppDetail AS ad   

inner join  AppDetailFee adf ON
      ad.AppID = adf.AppID 

WHERE  adf.Amount =0

【问题讨论】:

  • 只是在这里猜测,但您的 where 语句说“Where adf.Amount=0”不会排除任何行是 adf.Amount 0。这意味着第二个 case 语句永远不会是真的。
  • 这绝对不是您正在使用的实际代码,因为您有一个没有GROUP BY 的聚合 (MAX),它甚至不会在 SQL Server 中解析。请出示您的 ACTUAL 代码。
  • 如果使用 MAX 还需要使用 GROUP BY 子句
  • 当我将代码复制到这里时,group by 被转移了。我确实说过代码正在运行,但还有其他问题。因此,Group By 并没有丢失。

标签: sql sql-server-2008 case inner-join


【解决方案1】:

您有一个 WHERE 子句正在删除不符合条件的所有内容:

WHERE  adf.Amount =0

尝试删除它并运行您的查询:

SELECT  ad.AppID
      , MAX(case when (adf.TypeID = 6 AND adf.Amount = 0) then 0 
                 when (adf.TypeID = 6 AND adf.Amount <> 0) then Adf.Amount
                 else 0 END) AS FeeAmount
FROM  AppDetail AS ad   
inner join  AppDetailFee adf ON
      ad.AppID = adf.AppID 
group by ad.AppID

您的查询中还缺少GROUP BY 子句。

【讨论】:

  • 就是这样——他的另外两个 CASE 场景的计算结果为 0,而他只显示了 Amount 为 0 的位置。
  • 如果我错过了 Group By - 我不会得到答案,但我确实得到了答案,所以我确实有 group by 子句。
  • 我只需要在数量 = 0 时打印,因此我有 where 子句 = 0
  • @user1860212 where 子句将删除所有数量不为零的行,因此您不会得到任何符合案例adf.Amount &lt;&gt;0 的第二个条件的内容。
  • 基于表结构,我添加了一个额外的表来加入并且它起作用了
猜你喜欢
  • 2018-02-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2018-05-22
  • 2020-01-10
相关资源
最近更新 更多