2015-10-05 9 views
1

Я должен иметь столбец, который автоматически обновляет долг каждого члена в годSQL Server Добавление вычисляемого столбца с петлей WHILE

старый долг, используемый, чтобы быть 60,000 до 2013 года, после чего он стал 75 000

Существует также столбец «Активность», который я использую в программе, если элемент все еще активен, он установлен на «ДА», если он остановился, он изменился на «НЕТ» . Также есть ДРУГОЙ столб, pDebt ", что означает Paid Debt

Основная формула позади него - это простой AmountOfDebt - PaidDebt (AKA @Amount - pDe Ь)

Я попытался сделать эту новую таблицу, но у меня было 2 проблемы

  1. Столбцы (L.7 "dateOfRegistration" & L.10 "активность") продолжают давать знаменитый «Invalid Название столбца ", будучи существующим и уже используется в других подсчитанных столбцах

    PS: yes Я использовал Ctrl + Shift + R, я сохранил запрос, перезапустил SQL Server много раз, он все еще отображается, поэтому я угадывание есть проблема ввода

  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), но так как мой пОКА петля не работает, я не думал, что это было необходимо, чтобы работать через до конца правильно либо

Это сделано на SQL Server

Tha nk вы для чтения ребята, я был бы признателен даже за любую помощь.

+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 
Смежные вопросы