将(TSQL)与更新中的案例合并

将(TSQL)与更新中的案例合并,sql,tsql,stored-procedures,sql-server-2008-r2,sql-update,Sql,Tsql,Stored Procedures,Sql Server 2008 R2,Sql Update,我使用的是SQLServer2008R2,我有一个包含两个表的数据库 T1包含原始数据,但我只对成本、日期和账户ID列感兴趣 T2包含一些列,如一月、二月、三月、四月、。。。和列AccId 现在我需要一个存储过程,每当我更新T1时,它都会在T2中的相应列中设置值。它应该为给定月份的每个AccId汇总成本。如果我设置@year=2012和@month=3,那么它应该更新列Mar,每个AccId在T2中的成本之和,即T1和T2 我现在有了一个存储过程,它可以处理一个常量列。我现在想要CASE,它根据

我使用的是SQLServer2008R2,我有一个包含两个表的数据库

T1包含原始数据,但我只对成本日期账户ID列感兴趣

T2包含一些列,如一月二月三月四月、。。。和列AccId

现在我需要一个存储过程,每当我更新T1时,它都会在T2中的相应列中设置值。它应该为给定月份的每个AccId汇总成本。如果我设置@year=2012和@month=3,那么它应该更新列Mar,每个AccIdT2中的成本之和,即T1T2

我现在有了一个存储过程,它可以处理一个常量列。我现在想要
CASE
,它根据给定的月份选择列。下面是一个存储过程,我认为它应该如何工作,但它不工作:

CREATE PROCEDURE [dbo].[SP_Calc]
    @year int,
    @month int
AS

    MERGE INTO T2
    USING (
            SELECT AccId, SUM(Cost) AS CostSum
            FROM T1
            WHERE YEAR(Date) = @year
            AND MONTH(Date) = @month
            GROUP BY AccId
         ) AS source
      ON T2.AccID = source.AccId
    WHEN MATCHED THEN
    UPDATE SET 
     SELECT 
       CASE @month 
        WHEN 1 THEN Jan = source.Cost
        WHEN 2 THEN Feb = source.Cost
        WHEN 3 THEN Mar = source.Cost
        WHEN 4 THEN Apr = source.Cost
        WHEN 5 THEN Mai = source.Cost
        WHEN 6 THEN Jun = source.Cost
        WHEN 7 THEN Jul = source.Cost
        WHEN 8 THEN Aug = source.Cost
        WHEN 9 THEN Sep = source.Cost
        WHEN 10 THEN Oct = source.Cost
        WHEN 11 THEN Nov = source.Cost
        WHEN 12 THEN Dez = source.Cost
        ELSE RAISERROR ('Month is out of range', 18, 1); 
    END

你的来源中没有成本,只有成本总额

您还需要将设置更改为

SET
   Jan = CASE @month  WHEN 1 THEN source.CostSum else T2.Jan end,
   Feb = CASE @month  WHEN 2 THEN source.CostSum else T2.Feb end,
...