Индексированные представления: Как вставить значение в другую таблицу с индексными представлениями?
Мой стол:
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
Обратите внимание, что вы, вероятно, захотите включить 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 дней, Здесь сумму нужно разделить на декабрьский месяц, т.е. текущий месяц и январь месяц, может кто-нибудь дать мне знать, как этого добиться