【问题标题】:sql for product price update from exchange rate from multiple table从多个表中的汇率更新产品价格的sql
【发布时间】:2016-04-22 22:44:09
【问题描述】:

我有两个表“curreny”和“product_price”。有些商品是进口的,所以我们需要随着汇率的变化而更新它们的价格。

“curreny”表保持各种货币的最新汇率。

"product_price" 表保留字段 "main_price","foreign_price","currency_iso","base_currency"

货币表(每日更新)

c_iso      rate
---------------
USD       3.0257
EUR       3.3547

产品价格表

 id       def     main_price  foreign_price  currency_iso  base_currency
 1     Product1      30.2570       10            USD           1        
 2     Product2      50            14.904        EUR           0      
 3     Product3      67.094        20            EUR           1   

我需要根据 base_currency 更新所有产品价格。

例如对于 product1,base_currency 是 1,这意味着 USD 是产品的实际价格。因此,根据“货币”表中的新汇率,产品的 foeign_price 应乘以美元汇率。

 main_price = foreign_price*rate

对于product2,base_currency 为0,这意味着main_price 是产品的实际价格。因此,根据“货币”表中的新汇率,产品的 foeign_price 应按美元汇率进行调整。

 foreign_price = main_price/rate.

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    在尝试了多个 if/case 语句的设置后,我找到了一个有效的代码:

    update product_price as p 
    inner join currency as c  on(c.c_iso = p.currency_iso)   
    set p.main_price = case p.base_currency when true then
    p.foreign_price*c.rate when false then p.main_price
    end,
    p.foreign_price = case p.base_currency when false then
    p.main_price/c.rate when true then p.foreign_price 
    end;
    

    【讨论】:

      【解决方案2】:

      我认为这是您需要的更新:

      update product_price p join
             currency c
             on c.c_iso = p.currency_iso
          set main_price = (case when p.base_currency = 1
                                 then p.foreign_price * c.rate
                                 else p.foreign_price / c.rate
                            end)
          where p.base_currency in (0, 1);
      

      编辑:

      根据评论:

      update product_price p join
             currency c
             on c.c_iso = p.currency_iso
          set main_price = (case when p.base_currency = 1
                                 then p.foreign_price * c.rate
                                 else main_price
                            end),
              foreign_price = (case when p.base_currency = 0
                                    then p.foreign_price / c.rate
                                    else foreign_price
                            end)
          where p.base_currency in (0, 1);
      

      【讨论】:

      • 更新的字段应该不同,取决于 base_currency 如果 1 设置主要价格,否则应该更新 foreign_price。
      • @aliaktas 。 . .然后你需要两个set 列。
      猜你喜欢
      • 2022-06-22
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 2015-04-22
      • 1970-01-01
      • 2019-10-29
      相关资源
      最近更新 更多