2015-10-05 88 views
1

我應該有一個列自動更新每個成員的債務,每年SQL服務器添加計算列與WHILE循環

使用60,000直到2013年,之後,它成爲了舊有債務75,000

我還在程序中使用了一個「活動」列,如果該成員仍然活動,它被設置爲「YES」,如果他停下來,它會更改爲「NO」 還有另一個名爲「 pDebt「,代表支付的債務

它背後的基本公式是一個簡單的AmountOfDebt - PaidDebt(AKA @Amount - pDe BT)

我試圖讓新表,但我有2個問題

  1. 的列(1.7「dateOfRegistration」 & L.10「活動」)不斷給了著名的「無效列名「,而其他計算列已經被使用並且已經在其他計算列中使用了

    PS:是的,我沒有使用Ctrl + Shift + R,猜測有輸入問題

  2. 我無法將我的WHILE循環連接到ADD函數以添加新表格。

這裏是我的代碼,

Use [Project Alpha1] 
GO 

BEGIN 

DECLARE @Amount MONEY = 0, 
@IndividualYear int = YEAR([dateOfRegistration]) 

ALTER TABLE initialTable 
ADD fDebt1 AS (WHILE (@IndividualYear < GETDATE() AND [Activity] = 'YES') 
BEGIN 
    IF @IndividualYear = 1998 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 1999 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2000 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2001 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2002 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2003 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2004 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2005 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2006 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2007 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2008 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2009 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2010 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2011 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2012 SET @Amount = @Amount + 60000 
    Else 
    IF @IndividualYear = 2013 SET @Amount = @Amount + 60000 
    Else 
     SET @Amount = @Amount + 75000 

    SET @IndividualYear = @IndividualYear + 1 
END 
@Amount - pDebt) 

我很抱歉,我知道我沒有輸入正確的代碼(最後一行說@Amount - pDebt)結束,但因爲我的WHILE循環不工作,我真的不認爲這是必要的,通過工作,直到最終正確要麼

這是SQL服務器上進行

臨屋對於讀書的人,我會很感激,即使是最細微的幫助。

+0

這聽起來像一個非常怪異的設計給我。我想他們也會付款,並跟蹤個人付款,所以你會有某種類型的分類賬表。爲什麼不建立一個運行的SQL作業插入債務記錄而不是重新計算幾個字段?這樣,該表格將始終提供帳戶餘額。 – UnhandledExcepSean

回答

1

一種方法是將您的邏輯/計算包含在標量函數中,以便您的計算字段只是調用該函數。這樣測試也會更容易。

ALTER TABLE initialTable ADD fDebt1 AS dbo.f_CalculateDebt([RegistrationDate], [Activity], [Debt]) 

那麼你的標量函數可以是這個樣子:

CREATE FUNCTION f_CalculateDebt(
    @RegistrationDate DATETIME, 
    @Activity NVARCHAR(100), 
    @Debt MONEY 
) 
RETURNS MONEY 
AS 
BEGIN 
    DECLARE 
     @Amount MONEY = 0, 
     @IndividualYear INT = YEAR(@RegistrationDate) 
    WHILE (@IndividualYear < YEAR(GETDATE()) AND @Activity = 'YES') BEGIN 
     IF @IndividualYear = 1998 
      SET @Amount = @Amount + 60000 
     -- Removed for readability -- 
     ELSE IF @IndividualYear = 2013 
      SET @Amount = @Amount + 60000 
     ELSE 
      SET @Amount = @Amount + 75000 
     SET @IndividualYear = @IndividualYear + 1 
    END 
    RETURN @Amount - @Debt 
END 
GO