2012-12-14 36 views
0

我有2个表。一个具有订单元素(OE),另一个具有项目信息(PO)。 1个项目有很多订单元素。表格的设置方式是,项目日期在采购订单中,货币在采购订单中。我需要更新OE表中的欧元汇率。我试图做这样的事情包含另一个表的案例的SQL Server更新

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表欧元汇率的列。我有从网站(不在表格中)获得的平均每月汇率。我想根据项目的月份和货币设置此汇率栏。我将在单独的查询中处理每种货币,因此人民币是我担心查询的唯一货币。该月份在采购订单表中。我需要在case语句中使用PO表中的月份。

+0

什么不工作(除了你的语法不正确)? –

+0

这两张表是如何相关的?如果你想加入这些表格,他们会加入什么样的领域? – Taryn

+0

项目ID字段 – SmashCode

回答

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' 
+0

将会有附加值。我刚刚展示了一月,以便查询更易于阅读。 – SmashCode

+0

这最终修复了它。 – SmashCode

0

究竟似乎是这个问题你只需要一个case语句?

我可以看到许多问题与查询。什么是你遇到的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表中的所有记录,否则需要告诉它哪些记录要更新。

因此,在总结你说

更新从POTest表中OETest表,其中的价值,当项目的日期时间字段的月份部分等于一月,和更新记录欧元汇率场币值是'元'。

请注意,您可能需要在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

+0

这是我在模板中使用update语句中的一个案例:http://www.bennadel.com/blog/933-Using-CASE-Statements-In-A-SQL-UPDATE-Query.htm – SmashCode

相关问题