【问题标题】:MERGE (TSQL) with CASE in UPDATE在 UPDATE 中使用 CASE 合并(SQL)
【发布时间】:2012-07-18 08:17:01
【问题描述】:

我使用的是 SQL Server 2008 R2,并且我有一个包含两个表的数据库。

T1 包含原始数据,但只有 CostDateAccId 列对我来说很有趣。

T2 包含几列,例如 JanFebMarApr >, ... 和一列 AccId

我现在需要一个存储过程,每当我更新 T1 时,它都会在 T2 中的相应列中设置值。它应该总结给定月份中每个 AccIdCost。如果我设置 @year = 2012 和 @month = 3,那么它应该用 T2 中的 Cost 总和更新列 Mar AccId,在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

【问题讨论】:

    标签: sql tsql stored-procedures sql-server-2008-r2 sql-update


    【解决方案1】:

    您的来源中没有成本,只有 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,
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 2021-04-07
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多