Sql 索引视图:如何使用索引视图将值插入到其他表中?

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

我的桌子:

它看起来是什么样子:

我希望它能自动将每月的金额插入到一个新表中,使其如下所示:

例如,如果它说In_Months=2,它应该每月填写1月和2月的余额,达到7058,82。我想让它自动计算,就像我让它根据输入自动计算剩余天数一样


谢谢大家!

您需要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