【问题标题】:sql complex case when statement for a calculated field计算字段的sql复杂情况下的语句
【发布时间】:2012-08-07 10:45:03
【问题描述】:

对于这个复杂的 sql 语句,我需要帮助。在选择查询中,我需要向具有这种结构的计算字段添加一条语句:

If Field1 = 'value1' then


If Field2 = 0 then FCalculated1 = FieldA * FieldB

else FCalculated1 = FieldA * FieldC

end

FCalculated2 = FCalculated1 * FieldA


else if Field1 = 'value2' then


If Field2 = 0 then FCalculated2 = FieldD * FieldB

else FCalculated2 = FieldD * FieldE

end

FCalculated1 = FCalculated2 / FieldA


end

基本上,我需要将一个条件嵌套在另一个条件中,并使用计算字段作为另一个字段的来源。有没有人可以帮帮我?

谢谢!!!

【问题讨论】:

  • 如果Field1 既不等于value1 也不等于value2 怎么办?为什么这些截然不同的计算必须占据相同的列?
  • 因为根据Field1的字段值,我需要计算字段的不同结果

标签: sql-server-2008 calculated-columns case-when


【解决方案1】:

试试这个

declare @Field1 int
declare @Field2 int
declare @FCalculated1 int
declare @FCalculated2 int
declare @FieldA int
declare @FieldB int
declare @FieldC int
declare @FieldD int
declare @FieldE int
declare @Value1 int
declare @Value2 int

select @FCalculated2 = case
 when @Field1 = @Value1 then  case
  when @Field2 = 0 then @FieldA * @FieldB
  else @FieldA * @FieldC
  end * @FieldA
 when @Field1 = @Value2 then case
    when @Field2 = 0 then @FieldD * @FieldB
    else @FieldD * @FieldE
 end
end

select @FCalculated2

我的意思是我已经使用变量来编译和测试它,只需将 @ 符号换成你的列名

【讨论】:

    【解决方案2】:

    SELECT 子句中的一列不能使用同一 SELECT 子句中不同计算的结果(本质上,因为在 SQL 中,所有列都可能并行计算)。通常,我建议使用子选择进行第一次计算,但这在这里似乎不合理,所以我只是重复计算:

    select
    CASE
        WHEN Field1 = 'value1' THEN
            CASE WHEN Field2 = 0 THEN FieldA * FieldB
                ELSE FieldA * FieldC
            END
        WHEN Field1 = 'value2' THEN
            CASE WHEN Field2 = 0 THEN FieldD * FieldB
                ELSE FieldD * FieldE
            END / FieldA
    END as FCalculated1,
    CASE
        WHEN Field1 = 'value1' THEN
            CASE WHEN Field2 = 0 THEN FieldA * FieldB
                ELSE FieldA * FieldC
            END * FieldA
        WHEN Field1 = 'value2' THEN
            CASE WHEN Field2 = 0 THEN FieldD * FieldB
                ELSE FieldD * FieldE
            END
    END as FCalculated2
    

    【讨论】:

    • @Rsg - 这个事实有什么相关性?我所做的只是将您的 if/else 结构直接转换为 SQL 等价物。
    • @Damien_The_Unbeliever- 你说得对,对不起!非常感谢您的回答。我在我的查询中测试它。 :)
    猜你喜欢
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2022-06-14
    • 2016-11-05
    • 1970-01-01
    相关资源
    最近更新 更多