0

SQL Server 2008 R2を使用していて、2つのテーブルを含むデータベースがあります。

T1には生データが含まれていますが、CostDateAccIdの列だけが私にとって興味深いものです。

T2には、 JanFebMarApr、...などのいくつかの列とAccId列が含まれています

T1を更新するたびに、 T2の適切な列に値を設定するストアドプロシージャが必要です。特定の月のすべてのAccIdのコストを合計する必要があります。@year=2012および@month=3に設定した場合、 T1およびT2にあるすべてのAccIdT2のコストの合計で列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
4

1 に答える 1

0

ソースにコストはありません。CostSumだけです。

また、設定を次のように変更する必要があります

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,
...
于 2012-07-19T07:51:27.413 に答える