Sql 索引视图:如何使用索引视图将值插入到其他表中?
我的桌子: 它看起来是什么样子: 我希望它能自动将每月的金额插入到一个新表中,使其如下所示: 例如,如果它说In_Months=2,它应该每月填写1月和2月的余额,达到7058,82。我想让它自动计算,就像我让它根据输入自动计算剩余天数一样Sql 索引视图:如何使用索引视图将值插入到其他表中?,sql,sql-server,indexing,triggers,indexed-views,Sql,Sql Server,Indexing,Triggers,Indexed Views,我的桌子: 它看起来是什么样子: 我希望它能自动将每月的金额插入到一个新表中,使其如下所示: 例如,如果它说In_Months=2,它应该每月填写1月和2月的余额,达到7058,82。我想让它自动计算,就像我让它根据输入自动计算剩余天数一样 谢谢大家! 您需要12行,每行代表一个月的编号1到12。我在一个CTE中使用了一个简单的UNIONALL查询,但是您可能已经有了一个数字表来代替。然后在月数小于或等于[in_month]列的情况下加入此项。该联接现在将自动将表中的行乘以所需的月数 ;with
谢谢大家! 您需要12行,每行代表一个月的编号1到12。我在一个CTE中使用了一个简单的UNIONALL查询,但是您可能已经有了一个数字表来代替。然后在月数小于或等于[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]或类似内容,以便可以追溯到源行id
如果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 11/30/2015 12/31/2015 1/31/2016 2/28/2016 3/31/2016 4/30/2016 5/31/2016 6/30/2016 7/31/2016 8/31/2016 9/30/2016 10/31/2016 11/30/2016 12/31/2016 10/29/2015 1/4/2016 67 $210.71 $6,321.33 $6,532.04 $842.84 $- $- $- $- $- $- $- $- $- $- $- 2015年10月29日2016年1月8日71$283.24$8497.16$8780.40$2265.91$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$-$- 应该是这样的@Mahesh 所以,@Usedbyalready的回答似乎有些过分,我试着自己用一个更新中的case来做,效果非常好
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;
此处的金额拆分不正确,例如,如果余额中的剩余天数如果今天的日期为2015-12-16,结束日期为2016-01-31,则剩余天数可能为46天,此处的金额需要拆分为12月份,即当前月份和1月份,有人能告诉我如何实现它吗我想把它插入我的月份表。你访问过sqlfiddle吗?如果不正确,请更改问题,以便我提供其他内容。但问题是,我所提供的正是你所描述的需求。只需在我的月数表或类似表格中添加即可。您仍然需要查询来生成所需的行。我真的不想每次获得新值时都粘贴它,例如,看看我是如何计算剩余天数的,如果可能的话,我希望它是自动的。要实现您所寻求的自动化,您需要一个触发器来获取现有表中的新行或更改行,以便在不同的表中生成1到12行。但该查询中概述的逻辑仍然有效。我不打算为您编写触发器。我建议您阅读这篇关于SQL server中索引视图的文章,但我认为您需要SQL server企业版才能使用该功能。否则,在现有表中添加/更改数据时,需要触发器和/或存储过程将行添加到另一个表中。它不能作为计算列在excel中复制和粘贴
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