2015-10-05 40 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