У меня есть следующие две таблицы quote(date,market,ticker,close)
и scenario(date1,date2,period,market,ticker,ratio)
.Я написал следующий запрос LEFT JOIN, который делает то, что я хочу, за исключением одной проблемы:
SELECT S.date1 AS date1,
S.date2 AS date2,
S.period AS period,
Q.market AS market,
Q.ticker AS ticker,
Q.close * EXP(S.ratio) AS scenario
FROM portfolio.quote Q LEFT JOIN portfolio.scenario S
ON Q.market = S.market AND
Q.ticker = S.ticker AND
S.date1 >= '2010-06-01' AND
S.date2 <= '2010-07-01' AND
S.period = 'WEEK'
WHERE Q.date = '2010-07-01'
ORDER BY S.date1, S.date2, S.period, Q.market, Q.ticker
Предыдущий запрос возвращает результаты и всякий раз, когда (рынок, тикер) в таблице котировок не совпадает с эквивалентным(market, ticker) в таблицу сценариев добавляется строка со значениями NULL для столбцов, принадлежащих таблице сценариев, следующим образом:
date1, date2, period, market , ticker, scenario
NULL , NULL , NULL , 'sp500', 'QEP' , NULL
За период между '2010-06-01' и '2010-07-01 'с периодом' WEEK 'может быть много несопоставленных строк для (' sp500 ',' QEP '), но только одна строка представляет этот факт со значениями NULL в столбцах, принадлежащих таблице сценариев.Не говоря уже о том, что в этих результатах есть много несопоставленных строк для (market, ticker), но существует хотя бы одно совпадение, поэтому запрос не возвращает значения NULL для этих строк.
Что я хочу сделать, это дляНапример, если Q.date = '2010-07-01' возвращает 500 строк для таблицы котировок, тогда будет 500 * (DISTINCT date1, date, period).со значениями NULL в столбце сценария, только когда следующее условие не соответствует:
Q.market = S.market AND
Q.ticker = S.ticker
Так, например, результаты NULL будут выглядеть примерно так:
date1 , date2 , period , market , ticker, scenario
'2010-06-01' , '2010-06-08' , 'WEEK' , 'sp500', 'QEP' , NULL
'2010-06-08' , '2010-06-15' , 'WEEK' , 'sp500', 'QEP' , NULL
'2010-06-15' , '2010-06-23' , 'WEEK' , 'sp500', 'A' , NULL
Другой пример, если, например,(market,ticker,close)
строк, которые соответствуют Q.date = '2010-07-01'
из таблицы кавычек:
('sp','A',1)
('sp','AA',2)
И (date1,date2,period,market,ticker,ratio)
строк, которые соответствуют условиям
S.date1 >= '2010-06-01' AND
S.date2 <= '2010-07-01' AND
S.period = 'WEEK'
:
('2010-06-01','2010-06-08','WEEK','sp','A',0.43)
('2010-06-01','2010-06-08','WEEK','sp','AA',0.21)
('2010-06-08','2010-06-20','WEEK','sp','A',0.49)
('2010-06-20','2010-06-27','WEEK','sp','A',0.46)
('2010-06-20','2010-06-27','WEEK','sp','B',0.23)
Тогда результат моего запроса должен вернуть
('2010-06-01','2010-06-08','WEEK','sp','A',1*EXP(0.43))
('2010-06-01','2010-06-08','WEEK','sp','AA',2*EXP(0.21))
('2010-06-08','2010-06-20','WEEK','sp','A',1*EXP(0.49))
('2010-06-08','2010-06-20','WEEK','sp','AA',NULL)
('2010-06-20','2010-06-27','WEEK','sp','A',1*EXP(0.46))
('2010-06-20','2010-06-27','WEEK','sp','AA',NULL)
Возможно ли такое в MySQL? Очень благодарен за любую помощь:)