0

我有 2 张桌子。一个有订单元素(OE),一个有项目信息(PO)。1个项目有很多订单元素。表格的设置方式,项目日期在 PO 中,货币在 OE 中。我需要更新 OE 表中的欧元汇率。我正在尝试做这样的事情

    UPDATE [OETest]
    SET [Euro Exchange Rate] = {
    CASE
        WHEN (DATEPART(month, PO.[Project Date Time]) = January)
        THEN 8.143296
        WHEN (DATEPART(month, PO.[Project Date Time]) = February)
        THEN 8.340111
    }
    FROM [POTest] PO, [OETest] OE       
    WHERE OE.[Currency] = 'YUAN'

但是我迷路了(这是我尝试过的许多查询之一)。谁能帮我构建必要的查询并告诉我它为什么有效?

这个特定的查询告诉我关键字 CASE 附近的语法不正确

为了更清楚地说明我要完成的工作:我在 OE 表中有一个欧元汇率列。我有从网站(不在表中)获得的平均每月汇率。我想根据项目的月份和货币来设置这个汇率栏。我将在单独的查询中处理每种货币,因此人民币是我担心此查询的唯一货币。月份在 PO 表中。我需要在案例语句中使用 PO 表中的月份。

4

2 回答 2

5
UPDATE OE -- the alias here rather than the base table name
   SET [Euro Exchange Rate] = 8.143296
  FROM [POTest] PO
  JOIN [OETest] OE ON OE.project_id = PO.project_id -- you need a link       
 WHERE OE.[Currency] = 'YUAN'
    -- the following date range represents January this year
    AND PO.[Project Date Time] >= '20120101'
    AND PO.[Project Date Time] <  '20120201'

如果您根据不同的日期需要不同的值,则只需要一个 case 语句

UPDATE OE -- the alias here rather than the base table name
   SET [Euro Exchange Rate] =
       CASE Month(PO.[Project Date Time])
            when 1 then 8.143296
            when 2 then 7.143296
            when 3 then 7.743296
            END
  FROM [POTest] PO
  JOIN [OETest] OE ON OE.project_id = PO.project_id -- you need a link       
 WHERE OE.[Currency] = 'YUAN'
    -- the following date range represents 3 months this year
    AND PO.[Project Date Time] >= '20120101'
    AND PO.[Project Date Time] <  '20120401'
于 2012-12-14T20:10:27.263 回答
1

究竟是什么问题?

我可以看到查询有很多问题。您遇到什么 sql 错误?

无论如何,如果我要尝试做与我“认为”您正在做的事情相同的事情,我会这样做:

UPDATE [OETest] OE
SET [Euro Exchange Rate] = 
(SELECT CASE WHEN (DATEPART(month, PO.[Project Date Time]) = 'January')
    THEN 8.143296
    ELSE 0.000000
END ExchageRate
FROM [POTest] PO)      
WHERE OE.[Currency] = 'YUAN'

我在这里要做的是在 SET 块之后选择我想要的结果。在 CASE 语句中,如果我没有从日期部分得到结果,我添加了一个 else。

WHERE 部分应该是 UPDATE 子句上的 WHERE 条件,因为您需要告诉它要更新哪些记录,除非您要更新该 OETest 表中的所有记录。

所以总而言之,你在说

当 Project Date Time 字段的月份部分等于一月时,使用 POTest 表中的值更新 Euro Exchange Rate 字段,并更新 OETest 表中货币值为“YUAN”的记录。

请注意,您可能需要在 SELECT 语句中有一个 WHERE 子句,因为它可能会返回多条记录,而您只需要一个订单来获取 Project Date Time 字段。猜测一下,您可能想要添加一个 where 语句,如下所示:

UPDATE [OETest] OE
SET [Euro Exchange Rate] = 
(SELECT CASE WHEN (DATEPART(month, PO.[Project Date Time]) = 'January')
    THEN 8.143296
    ELSE 0.000000
END ExchageRate
FROM [POTest] PO WHERE PO.ProjectID = 100)      
WHERE OE.[Currency] = 'YUAN'

让我知道这是否有帮助。

问候 JT

于 2012-12-14T20:23:30.173 回答