2012-08-10 80 views
1

我需要幫助這個複雜的SQL語句。在選擇查詢,我需要一個語句添加到計算的字段這種結構: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 

基本上我需要一個窩內有條件的另一個和使用計算領域的另一場的來源。有人可以幫助我嗎?

謝謝!!!

+0

如果'Field1'等於niether'value1'也不'value2'?爲什麼這些大不相同的計算必須佔據相同的列? – 2012-08-10 06:34:10

+0

因爲根據Field1的字段值,我需要計算字段的不同結果 – Rsg 2012-08-10 06:46:22

回答

2

試試這個

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 
+0

FieldA可以是0 – Rsg 2012-08-10 07:14:45

+0

@Rsg - 這個事實的相關性是什麼?我所做的一切都是將你的if/else結構直接翻譯成一個SQL等價物。 – 2012-08-10 07:21:34

+0

@ Damien_The_Unbeliever-你說得對,對不起!非常感謝您的回答。我在我的查詢中測試它。 :) – Rsg 2012-08-10 07:30:46