Mysql выберите арифметику с результатами столбца

Я получил этот результат из своей таблицы для двух нижележащих TQQQ и SQQQ.

select TradeDate, Stock_Short, LastPrice*Volume as USDVolume from aktien 
where Stock_Short ="TQQQ" OR Stock_Short = "SQQQ" order by TradeDate desc

что дает этот результат

Result

выглядит так

2018-10-30  SQQQ     1131165621.6
2018-10-30  TQQQ     1100960774.12
2018-10-29  SQQQ     996285358.9
2018-10-29  TQQQ     1263999527.63
2018-10-26  SQQQ     831584079.95
2018-10-26  TQQQ     1496815364.75
2018-10-25  SQQQ     608926709.68

Теперь я хочу вычесть TQQQ-SQQQ для каждого календарного дня в таблице.

2018-10-30 -30,204,847
2018-10-29 etc ...

Как я могу это сделать?

1
0
40
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

  • Вы можете выполнить Group By на TradeDate, и вы можете использовать If() или Case .. When для условной оценки Sum() в соответствии со значениями Stock_Short.
  • В конце концов, вы можете просто рассчитать разницу, используя условно суммированные значения.

Попробуйте следующий запрос:

SELECT 
  TradeDate, 
  (
   SUM(IF(Stock_Short = "TQQQ", LastPrice * Volume, 0)) - 
   SUM(IF(Stock_Short = "SQQQ", LastPrice * Volume, 0)) 
  ) AS difference 
FROM aktien 
WHERE Stock_Short IN ("TQQQ","SQQQ")
GROUP BY TradeDate 
ORDER BY TradeDate DESC 

При использовании Case .. When запрос будет выглядеть следующим образом:

SELECT 
  TradeDate, 
  (
   SUM(CASE WHEN Stock_Short = "TQQQ" THEN LastPrice * Volume ELSE 0 END) - 
   SUM(CASE WHEN Stock_Short = "SQQQ" THEN LastPrice * Volume ELSE 0 END) 
  ) AS difference 
FROM aktien 
WHERE Stock_Short IN ("TQQQ","SQQQ")
GROUP BY TradeDate 
ORDER BY TradeDate DESC 

почему так сложно? Почему не работает мое решение? `SELECT a.Stock_Short, a.TradeDate, b.Stock_Short, a.lastprice - b.lastprice из aktien a соединить aktien b на a.TradeDate = b.TradeDate, где a.Stock_Short = 'TQQQ' и b.Stock_Short = 'SQQQ ';

Walter Schrabmair 31.10.2018 12:26

@NoobPython Я значительно оптимизировал код. Я понял, что нет необходимости использовать запрос подвыборки; Пожалуйста, проверьте обновленный ответ и дайте мне знать, работает он по-прежнему или нет.

Madhur Bhaiya 31.10.2018 12:41

@NoobPython и что в результате?

Madhur Bhaiya 31.10.2018 13:02

см. ниже. Благодарю. Я думаю, что соединение немного более интенсивно с точки зрения вычислений. но безопаснее.

AndiAna 31.10.2018 13:06
Ответ принят как подходящий

ВЫБЕРИТЕ a.Stock_Short, a.TradeDate, b.Stock_Short, a.lastprice, a.volume, b.lastprice, b.volume, (a.volume * a.lastprice) - (b.volume * b.lastprice) из aktien a aktien b на a.TradeDate = b.TradeDate, где a.Stock_Short = 'TQQQ' и b.Stock_Short = 'SQQQ';

Я пробовал вышеуказанное решение Мадура, а также решение Уолтера.

Я немного изменил это

SELECT a.TradeDate,(a.lastprice*a.Volume) - (b.lastprice*b.Volume) as USDflow 
from aktien a join aktien b on a.TradeDate = b.TradeDate where a.Stock_Short =    
'TQQQ' and b.Stock_Short = 'SQQQ' order by TradeDate desc ;

Это дает тот же результат, что Madhurs занимает 0,029 с на запрос. поэтому немного длиннее.

Но я думаю, что преимущество этого решения - обработка TradeDate. Если TradeDate отсутствует для одного, JOIN проигнорирует этот TradeDate, тогда как решение Madhurs все равно вычислит сумму / разницу.

Спасибо обоим!

Другие вопросы по теме