簡體   English   中英

希望基於特定條件從兩個表中聚合數據(SQL條件連接)

[英]Want aggregated data from two tables based on specific condition (SQL conditional join)

我有兩張桌子。

T_MarkPrice

+--------+--------+-------+------------+
| FundID | Symbol | Price | Date       |
+--------+--------+-------+------------+
| 0      | DELL   | 10    | 2014-12-09 |
| 1      | DELL   | 11    | 2014-12-09 |
| 2      | DELL   | 12    | 2014-12-09 |
+--------+--------+-------+------------+

T_Data

+--------+--------+------------+
| FundID | Symbol | Date       |
+--------+--------+------------+
| 1      | DELL   | 2014-12-09 |
| 2      | DELL   | 2014-12-09 |
| 3      | DELL   | 2014-12-09 |
+--------+--------+------------+    

我想以以下格式從兩個表中聚合數據

符號和日期是匹配的必要條件(即T_Data的符號和日期應與T_MarkPrice匹配)。

FundID匹配是可選條件,如果T_MarkPrice中提供T_Data的fundID,則從該行中選擇價格,否則從FundID為0匹配日期和符號的行中選擇價格。

在這里我們可以看到T_MarkPrice表中不存在fundID 3,在這種情況下,我們必須選擇FundID 0的markprice。

輸出應如下-

+--------+--------+------------+-------+
| FundID | Symbol | Date       | Price |
+--------+--------+------------+-------+
| 1      | DELL   | 2014-12-09 | 11    |
| 2      | DELL   | 2014-12-09 | 12    |
| 3      | DELL   | 2014-12-09 | 10    |
+--------+--------+------------+-------+

將默認價格記錄和匹配記錄都添加到數據記錄中。 然后顯示匹配價格(如果存在),否則顯示默認價格。

select 
  d.fundid, 
  d.symbol, 
  d.date,
  coalesce(mp.price, mpdef.price) as price
from t_data d
left join t_markprice mpdef on 
  mpdef.symbol = d.symbol and mpdef.date = d.date and mpdef.fundid = 0
left join t_markprice mp on
  mp.symbol = d.symbol and mp.date = d.date and mp.fundid = d.fundid;

您可以LEFT JOIN連接兩個表,並使用COALESCE將不匹配行的price替換為fundId = 0的價格值,如下所示:

SELECT 
  d.FundID,
  d.Symbol,
  d.Date,
  COALESCE(p.price, (SELECT Price
                     FROM T_MarkPrice
                     WHERE FundID = 0)) AS Price
FROM T_Data AS d 
LEFT JOIN T_MarkPrice AS p  ON p.FundID = d.FundID 
                            AND p.Symbol = d.Symbol
                            AND p.Date = d.Date;

LEFT JOIN將使不匹配的行(如FundID = 3的行)包含在結果集中,並且其pricenull ,然后COALESCE將這些不匹配的行的可空價格值替換為fundid =的價格值t_markprice表中的0。

這將為您提供:

| FUNDID | SYMBOL |       DATE | PRICE |
|--------|--------|------------|-------|
|      1 |   DELL | 2014-12-09 |    11 |
|      2 |   DELL | 2014-12-09 |    12 |
|      3 |   DELL | 2014-12-09 |    10 |

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM