round(CAST(
      (CASE WHEN 计款方式 = '收费' THEN 
       CASE WHEN dbo.客户.下订单 = '-1' THEN 
       CASE WHEN 正品 + 备品 > PO量 THEN 
      round(PO量 * CAST(COALESCE (round(dbo.送货单明细.单价,3),0) AS NUMERIC(10, 3)), 3) 
      ELSE 
      round((正品 + 备品)* CAST(COALESCE (round(dbo.送货单明细.单价, 3),0) AS NUMERIC(10, 3)), 3) 
      END ELSE
      round((dbo.送货单明细.正品 + 备品)* CAST(COALESCE (round(dbo.送货单明细.单价, 3),0) AS NUMERIC(10, 3)),3) 
      END ELSE 0 END) 
      AS numeric(10, 3)),3) AS 应收金额      
 有个查询时这样的,我想加个条件是     
      
        Case when 进出性质.性质名称='样板(收费)A' THEN
        round(dbo.送货单明细.单价, 3)
 即当性质='样板(收费)A'时,  单价等于应收金额
---------------------------------
round(CAST(
      (CASE WHEN 计款方式 = '收费' THEN 
       CASE WHEN dbo.客户.下订单 = '-1' THEN 
       CASE WHEN 正品 + 备品 > PO量 THEN 
       Case when 进出性质.性质名称='样板(收费)A' then
      round(PO量 * CAST(COALESCE (round(dbo.送货单明细.单价,3),0) AS NUMERIC(10, 3)), 3) 
      ELSE 
      round((正品 + 备品)* CAST(COALESCE (round(dbo.送货单明细.单价, 3),0) AS NUMERIC(10, 3)), 3) 
      END ELSE
      round((dbo.送货单明细.正品 + 备品)* CAST(COALESCE (round(dbo.送货单明细.单价, 3),0) AS NUMERIC(10, 3)),3) 
      End else
      round(dbo.送货单明细.单价, 3)
      END ELSE 0 END) 
      AS numeric(10, 3)),3) AS 应收金额
这么写,怎么不是那性质的条件也按单价算应收金额了啊?

解决方案 »

  1.   

    顺便帮我解释下CAST(
          (CASE WHEN ...THEN 
           CASE WHEN ...THEN 这样镶套的意思,我看不懂这个
      

  2.   

    你加那句,就是这个伪码的逻辑:
    if 计款方式 = '收费' and dbo.客户.下订单 = '-1' and 正品 + 备品 > PO量 and 进出性质.性质名称='样板(收费)A'
    round(PO量 * CAST(COALESCE (round(dbo.送货单明细.单价,3),0) AS NUMERIC(10, 3)), 3) 不知道是不是你期望的逻辑
      

  3.   

    round(CAST(
          (CASE WHEN 计款方式 = '收费' THEN 
           CASE WHEN dbo.客户.下订单 = '-1' THEN 
           CASE WHEN 正品 + 备品 > PO量 THEN 
           Case when 进出性质.性质名称='样板(收费)A' then
          round(PO量 * CAST(COALESCE (round(dbo.送货单明细.单价,3),0) AS NUMERIC(10, 3)), 3) 
          ELSE 
          round((正品 + 备品)* CAST(COALESCE (round(dbo.送货单明细.单价, 3),0) AS NUMERIC(10, 3)), 3) 
          END ELSE
          round((dbo.送货单明细.正品 + 备品)* CAST(COALESCE (round(dbo.送货单明细.单价, 3),0) AS NUMERIC(10, 3)),3) 
          End else
          round(dbo.送货单明细.单价, 3)
          END ELSE 0 END) 
          AS numeric(10, 3)),3) AS 应收金额
      

  4.   


           CASE WHEN 计款方式 = '收费' THEN 
           CASE WHEN dbo.客户.下订单 = '-1' THEN 
           CASE WHEN 正品 + 备品 > PO量 THEN 
             与下面else是一一对应?
    如果是,一楼我做的修改为什么不得3楼不是我想要的,4楼结构是清晰,但这里没解释一楼的问题
      

  5.   

    case when then else 
    case when then else end
    ...
    end
      

  6.   

    这个逻辑怎么写
    1.计款方式 <> '收费' --> 金额=0
    2.计款方式 = '收费'  --> 金额=公式A
    2.1 进出性质.性质名称='样板(收费)A'  --> 金额=公式B
    2.2 进出性质.性质名称<>'样板(收费)A' -->2.3\2.4
    2.3 dbo.客户.下订单 = '-1' --> 金额=公式C
    2.4 正品 + 备品 > PO量 --> 金额=公式D
      

  7.   


    这么说条件2,岂不是要输出两个金额?
    应该
    1.计款方式 <> '收费' --> 金额=0
    2.计款方式 = '收费' 
     2.1 进出性质.性质名称='样板(收费)A'  --> 金额=公式B
     2.2 进出性质.性质名称<>'样板(收费)A' -->2.3\2.4 //这里需使用,2.3,2.4计算出来的值,再一层的嵌套
        2.3 dbo.客户.下订单 = '-1' --> 金额=公式C
        2.4 正品 + 备品 > PO量 --> 金额=公式D
    2.5 else  --> 金额=公式
    吧!
    大致意思是不是这样的!
    case when 计款方式 <> '收费' then 0
         when 计款方式 = '收费'  then
               case when 进出性质.性质名称='样板(收费)A then round(PO量 * CAST(COALESCE (round(dbo.送货单明细.单价,3),0) AS NUMERIC(10, 3)), 3) 
               else 
                 (case when dbo.客户.下订单 = '-1' then 公式C end)/(case when 正品 + 备品 > PO量 then 公式C end)
               end
    end
      

  8.   


    --伪码
    case when 计款方式 <> '收费' then 0
         when 计款方式 = '收费'  then
               case when 进出性质.性质名称='样板(收费)A' then 公式B
               else 
                 (case when dbo.客户.下订单 = '-1' then 公式C end)/(case when 正品 + 备品 > PO量 then 公式C end)
               end
    end
      

  9.   


    看一下联机丛书吧,里面太详细了
    计算条件列表并返回多个可能结果表达式之一。
    CASE 表达式有两种格式:
    CASE 简单表达式将某个表达式与一组简单表达式进行比较以确定结果。
    CASE 搜索表达式计算一组布尔表达式以确定结果。
    两种格式都支持可选的 ELSE 参数。