[英]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的行)包含在結果集中,並且其price
為null
,然后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.