2015-10-13 89 views
1

我需要在我們的某個存儲過程中應用某些邏輯。基於Sql server中的輸入參數的用例聲明

我們在sp中有一個參數@season

如果@season = 0,那麼我有整整一年的預算價值。

如果@season = 1,則我必須採取稅季預算值

如果@season = 2,則我必須採取季前預算值。

我得出每個賽季 的開始日期和結束日期爲@SeasonStrt@SeasonEnd

@SeasonStart是從1月1日至四月30日和@SeasonEnd從五月1日至12月30日

我已經試過類似下面,

SELECT SUM(ISNULL(lab.BudgetAmt,0)), 
SUM(ISNULL(lab.ProjectedHours,0)) 
FROM [dbo].[Budget] bud 

WHERE [Year] = @taxyear 
AND ((@season = 0) OR (Season= @season)) 
     AND CASE WHEN @season in (1,2) 
     THEN bud.[week] >= CASE WHEN @season in (1,2)THEN @SeasonStrt ELSE bud.[week] END 
     AND bud.[week] <= CASE WHEN @season in (1,2)THEN @SeasonStrt ELSE bud.[week] END 

Sql服務器給出語法錯誤。什麼是符合我要求的解決方案?

感謝您的幫助

+0

您需要在告訴我們更精確的結合您的條件是什麼3個不同的日曆是因爲我們不知道您的業務規則。也許只是給我們提供每個賽季開始和結束日期的樣本?那麼我們可以幫助將其轉換爲T-SQL –

+0

請提供架構和示例數據,或者更好的SQLFiddle。 –

+0

CASE返回一個值,這是因爲它正在選擇返回一列。該錯誤是由於SQL期望類似於value = case ...您可以在沒有case語句的情況下重寫WHERE或將其更改爲 – jean

回答

0

試試這個:

SELECT SUM(ISNULL(lab.BudgetAmt,0)), 
SUM(ISNULL(lab.ProjectedHours,0)) 
FROM [dbo].[Budget] bud 
WHERE [Year] = @taxyear 
AND 
(
    ((@season = 0) AND (Season = @season)) 
    OR ((@season = 1) AND (bud.[week] >= @SeasonStrt)) 
    OR ((@season = 2) AND (bud.[week] <= @SeasonStrt)) 
) 

所以,想法很簡單:用OR和具體@season

+0

感謝解決方案。但還有一個查詢。如果桌子沒有列季節怎麼辦?我可以這樣寫,((@季節= 0)或..... – bmsqldev

+0

@ user5359841當然,當然 – Backs