2012-07-19 68 views
0

我正在使用SQL Server 2008 R2,並且我有一個包含兩個表的數據庫。具有CASE更新中的MERGE(TSQL)

T1包含原始數據,但僅列成本日期ACCID對我來說是有趣的。

T2包含像幾列四月,...和列ACCID

我現在需要一個存儲過程,而設置值在T2適當的列中,只要我更新T1。它應該在給定月份中每AccId總結成本。如果我設置@year = 2012和@month = 3,所以它應該與成本T2總和爲每ACCID,這是在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 

回答

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, 
... 
+0

謝謝!這工作完美。 – Niklas 2012-07-19 08:04:06