2017-07-07 70 views
0

我有以下問題:如何將兩個sql表達式合併爲一個?

  • 有必要編寫一個查詢,將輸出'ITEM_ID''price_in_byr'。
  • 「price_in_byr」計算爲「價格」的項目表在速度的最大日期從表乘以匯率。

See Schema

我爲我的英語道歉,我會嘗試通過例子來解釋:

商品與ITEM_ID = 5費20歐元,在費率表中的最大日期對於歐元是1月12日,當時的匯率是25.我們的'price_in_byr'是25 * 20 = 500

我對臨時表的解決方案:

CREATE TABLE tempRate SELECT currency, MAX(rate) AS maxRate FROM rates GROUP 
BY currency; 

SELECT items.item_id,(ifnull(tempRate.maxRate,1) * items.price) AS price_in_byr 
FROM items 
LEFT JOIN tempRate ON items.currency = tempRate.currency; 

請告訴我,我該怎麼做,在一個查詢?

+0

MAX(匯率)將返回最高匯率,無論其日期如何,它都不會產生最近匯率(在「最大」**日期**) - 因此無論您在一個查詢或臨時表中執行此操作。 – mathguy

+0

如果您選擇TABS部分中的數據庫產品(您的帖子的底部),這將有所幫助。 Tab-spamming(包括MySQL,SQL Server,Oracle)無濟於事 - 戈登編輯您的帖子以刪除「垃圾郵件」。如果IFNULL爲你工作,那就排除了甲骨文,但否則我們會猜測。 – mathguy

+0

@mathguy,謝謝你的回答。我英語不強,不幸的是需要很長時間才能理解答案。我試圖找出 –

回答

0

你可以使用子查詢:

SELECT 
    items.item_id,(ifnull(tempRate.maxRate,1) * items.price) AS price_in_byr 
FROM 
    items 
    LEFT JOIN 
    (
    SELECT 
     currency, MAX(rate) AS maxRate 
    FROM 
     rates 
    GROUP BY 
     currency 
    ) AS tempRate 
    ON items.currency = tempRate.currency; 

在實踐中,您可以通過(definition of tempRate) AS tempRate代替 「tempRate」。

您可以在看到一個例子dbfiddle here


如果你真的想要* most_recent_rate *,你會做一些完全不同的;插入一個子查詢來計算它。此子查詢查找指定currency的所有利率,由他們exchange_ts(意時間戳)以降序排序他們,只是挑選到上1:

SELECT 
    items.item_id,(ifnull(
    (
     SELECT 
      rate AS most_recent_rate 
     FROM 
      rates 
     WHERE 
      rates.currency = items.currency 
     ORDER BY 
      exchange_ts DESC 
     LIMIT 1  
    ) 
    , 1) * items.price) AS price_in_byr 
FROM 
    items ; 

dbfiddle here

+0

MAX(匯率)不一定是「最高**日期**」的匯率。 – mathguy

+0

你是對的,這是給定貨幣的表格上的最大利率。這是否是預期的價值取決於具體的應用。當物品定價(或買入/賣出)時,我通常*尋找*日期(和時間)*(或之前的可用貨幣)的*匯率*。但是,這是否是這裏的預期用法,是原來的海報。該值使用'maxRate'命名,而不是'currentRate'或'rateAtTimeOfSale' ...因此,解釋是完全開放的。 – joanolo

0

你可以讓你tempRate查詢到一個子查詢:

SELECT 
    items.item_id, 
    (ifnull(tempRate.maxRate,1) * items.price) AS price_in_byr 
FROM 
    items 
    LEFT JOIN (
     SELECT currency, MAX(rate) AS maxRate 
     FROM rates 
     GROUP BY currency 
     ) as tempRate ON items.currency = tempRate.currency; 
+0

MAX(費率)不一定是「最高**日期**」的費率。 – mathguy

0

我不知道如果MySQL支持此級別的子查詢,但看看它的工作原理:

select I.item_id, I.price * CR.rt 
from 
items as I, 
(
    select r.currency cy, r.rate rt 
    from 
     rates as r, (select currency, max(date) max_date from rates group by currency) as R_MAXDATES 
    where 
     r.currency = R_MAXDATES.currency 
     and r.date = R_MAXDATES.max_date; 
) As CR 
where 
I.currency = CR.cy