我正在使用 SQL Server 2008 R2,并且我有一个包含两个表的数据库。
T1包含原始数据,但只有列Cost、Date和AccId对我来说很有趣。
T2包含一些列,例如Jan、Feb、Mar、Apr,...和一列AccId
我现在需要一个存储过程,每当我更新T1时,它都会在T2的相应列中设置值。它应该总结给定月份中每个AccId的成本。如果我设置 @year = 2012 和 @month = 3,那么它应该使用T2中每个AccId的Cost总和更新列Mar,它位于T1和T2中。
我现在有一个可用于一个常量列的存储过程。我现在想要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