我有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表中。我需要在case语句中使用PO表中的月份。
答案 0 :(得分:4)
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'
如果您根据不同的日期需要不同的值,则只需要一个案例陈述
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'
答案 1 :(得分:0)
究竟是什么问题?
我可以看到查询的许多问题。你得到的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表中的所有记录。
总而言之,你在说
当“项目日期时间”字段的月份部分等于1月时,使用POTest表中的值更新“欧元汇率”字段,并更新OETest表中“货币”值为“YUAN”的记录。
请注意,您可能需要在SELECT语句中使用WHERE子句,因为它可能会返回多个记录,并且您只需要一个命令来获取“项目日期时间”字段。猜测,你可能想要添加一个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