2014-10-30 78 views
2

我有一个sql2008服务器,我需要计算折扣。SQL使用某个字段,如果另一个为空

在作怪字段是SuggestedRetailPriceBasePriceAdPrice

的逻辑是这样的:

if AdPrice is null 
    return baseprice/suggestedretailprice 
else 
    if AdEndDate < GETDATE() // Ad is still valid 
     return adprice/SuggestedRetailPrice 
    endif 
endif 

如果上面的是混乱的,这是我需要做的:

确定是否使用AdPrice或BasePrice取决于广告是否已过期,方法是将AdEndDate与GETDATE()进行比较。然后使用该字段并除以SuggestedRetailPrice并与值进行比较。即(AdPrice/SuggestedRetailPrice) >= 0.6

就像这样的事情甚至可以做一个查询?我知道有案例陈述,但我不确定它们是否适用于这种情况。

回答

2

您还可以嵌入内ISNULL()一个CASE语句来进一步简化它:

SELECT 
    ISNULL 
     (
     CASE 
      WHEN AdEndDate < GETDATE() 
      THEN AdPrice 
     END, 
     BasePrice 
    )/SuggestedRetailPrice 
+0

谢谢,这工作。我无法相信我得到了反向的AdEndDate/GETDATE比较:S – sk099 2014-10-31 17:04:49

0

是的 - CASE允许您投影派生值,即使通过多个分支或切换语句。一般格式如下:

SELECT ... 
    CASE WHEN AdPrice is null THEN baseprice/suggestedretailprice 
     WHEN AdEndDate < GETDATE() -- Ad is still valid 
     THEN adprice/SuggestedRetailPrice 
     ELSE 42 -- Project a value for the column if the other branches aren't matched 
    END AS MyValue 
+0

更多上下文:我的商业服务器中,因此只有一部分这样做我可以访问的查询的where子句。我明白你不能有“where case ..”声明,但它必须是“where [some field] = case”,所以这不起作用? – sk099 2014-10-30 19:31:36

+0

任何一个都可以工作 - 'CASE x当一个......当b那么......'就像是一个同样类型的'switch'和'CASE什么时候x那么......什么时候是一个无关的'如果那么其他'类型投影。 – StuartLC 2014-10-30 20:23:43

+0

有什么理由不起作用? '(isnull(当[adend] 0.8' 大部分它返回的项目都符合'> 0.8'条件,但是有3 -4具有有效的广告并且adprice/srp小于0.8。 – sk099 2014-10-30 21:43:26