Индексированные представления: Как вставить значение в другую таблицу с индексными представлениями?

Мой стол:

CREATE TABLE [dbo].[Balance] (
    [Id]             INT             IDENTITY (1, 1) NOT NULL,    
    [Balance]        DECIMAL (18, 2) NOT NULL,
    [Today_Date]     AS              (CONVERT([char](10),getdate(),(126))),
    [Date_end]       DATE            NOT NULL,
    [Remaining_Days] AS              (datediff(day,CONVERT([char](10),getdate(),(126)),[Date_end])),
    [In_Months]      AS              (datediff(day,CONVERT([char](10),getdate(),(126)),[Date_end]))/(30),
    [Amount_Monthly] AS              CAST((case when ((datediff(day,CONVERT([char](10),getdate(),(126)),[Date_end]))/30) = 0 then NULL else [Balance]/((datediff(day,CONVERT([char](10),getdate(),(126)),[Date_end]))/30) end) as DECIMAL(18,2)),
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

Как это выглядит:

Мои данные

Я хочу, чтобы он автоматически вставлял Amount_Monthly в новую таблицу, чтобы она выглядела так:

Таблица моих месяцев

Например, если он говорит In_Months = 2, он должен заполнить Balance_monthly за январь и февраль до 7058,82. Я хочу, чтобы он вычислял его автоматически Как я сделал так, чтобы он автоматически вычислял оставшиеся дни в зависимости от ввода.

Спасибо!

4 ответа

Решение

@Mahesh Итак, ответ @Usedbyalready выглядел довольно излишним, я попытался сделать это самостоятельно с кейсом в обновлении, и он отлично работает.

UPDATE Months
SET Months.Balance_monthly = 
    CASE 
        WHEN Balance.In_Months > 1 THEN Amount_Monthly          
    END
FROM Balance
JOIN Months 
ON Months.Id <= Balance.In_Months;

Я также сделал триггер, который автоматически вставляет значения в мою таблицу месяцев:

CREATE TRIGGER [Balance_monthly]
ON [dbo].[Balance]
FOR INSERT, UPDATE
AS
BEGIN
    SET NOCOUNT ON

    UPDATE Months
    SET Months.Balance_monthly = 
    ((Balance.In_Months + 12 - Months.Id) / 12) * Amount_Monthly          
    FROM Balance
    CROSS JOIN Months;


END

Вам нужно 12 строк, каждая из которых представляет месяц от 1 до 12. Я использовал для этого простой запрос на объединение всех в CTE, но у вас, возможно, уже есть таблица чисел для использования. Затем присоединитесь к этому, где номер месяца меньше или равен столбцу [in_Month]. Это объединение теперь автоматически умножит строки вашей таблицы на требуемое количество месяцев.

;with m12 as (
  select 1 as mn
  union all      select 2      union all      select 3      union all      select 4
  union all      select 5      union all      select 6      union all      select 7
  union all      select 8      union all      select 9      union all      select 10
  union all      select 11     union all      select 12
 )
select
        row_number() over(order by b.id, m12.mn) as [ID]
      , datename(month,dateadd(month,m12.mn - 1,0)) as [Month]
      , b.Amount_Monthly as Balance_Monthly
from Balance b
inner join m12 on m12.mn <= b.in_months

см.: http://sqlfiddle.com/

Обратите внимание, что вы, вероятно, захотите включить db.balance.id как [balanceid] или аналогичный в новую таблицу, чтобы вы могли проследить до идентификатора строки источника.

Если CTE являются проблемой, просто используйте вместо этого "производную таблицу", например

select
        row_number() over(order by b.id, m12.mn) as [ID]
      , datename(month,dateadd(month,m12.mn - 1,0)) as [Month]
      , b.Amount_Monthly as Balance_Monthly
from Balance b
inner join (
              select 1 as mn
              union all      select 2      union all      select 3      union all      select 4
              union all      select 5      union all      select 6      union all      select 7
              union all      select 8      union all      select 9      union all      select 10
              union all      select 11     union all      select 12
           ) as m12 on m12.mn <= b.in_months

Сегодняшняя дата Новая дата окончания Остальные дни Ежедневно 2015-11 2015-12 2016-01 2016-02 2016-03 2016-04 2016-05 2016-06 2016-07 2016-08 2016-09 2016-10 2016-11 2016-12 2016-12 30.11.2015 г. 31.12.2015 г. 31.01.2016 г. 28.02.2016 г. 31.03.2016 г. 31.04.2016 г. 30.06.2016 г. 31.07.2016 г. 31.08.2016 г. 30.09.2016,31.10.2016,30.11.2016,31.12.2016, 29.04.2015, 04.01.2016 67 $ 210,71 $ 6 321,33 $ 6 532,04 $ 842,84 $ - $ - $ - $ - $ - $ - $ - $ - $ - $ - $ -
29.10.2015 1/8/2016 71 $ 283,24 $ 8 497,16 $ 8 780,40 $ 2 265,91 $ - $ - $ - $ - $ - $ - $ - $ - $ - $ - $ -

так должно быть

Здесь сумма не разделяется правильно, например, если оставшиеся дни в Балансе, если сегодняшняя дата 2015-12-16 и конечная дата 2016-01-31, то оставшиеся дни могут составлять 46 дней, Здесь сумму нужно разделить на декабрьский месяц, т.е. текущий месяц и январь месяц, может кто-нибудь дать мне знать, как этого добиться

Другие вопросы по тегам