SQL Server 2008 R2を使用していて、2つのテーブルを含むデータベースがあります。
T1には生データが含まれていますが、Cost、Date、AccIdの列だけが私にとって興味深いものです。
T2には、 Jan、Feb、Mar、Apr、...などのいくつかの列とAccId列が含まれています
T1を更新するたびに、 T2の適切な列に値を設定するストアドプロシージャが必要です。特定の月のすべてのAccIdのコストを合計する必要があります。@year=2012および@month=3に設定した場合、 T1およびT2にあるすべてのAccIdのT2のコストの合計で列Marを更新する必要があります。
これで、1つの定数列で機能するストアドプロシージャができました。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