Вычитание значений в MySQL Table - PullRequest
6 голосов
/ 05 октября 2011

У меня есть цены в двух разных таблицах, и я хочу вычесть их (текущая цена-цена за последний день) и ЗАКАЗАТЬ их в форме DESC. Мне было интересно, если это можно сделать с помощью одной команды MySQL.

Структура таблицы

Table 1
id | Item Name | Date       | Price
 1 | alpha     | 2011-10-05 | 10
 2 | beta      | 2011-10-05 | 12
 3 | gamma     | 2011-10-05 | 14 

Table 2
id | Item Name | Date       | Price
 1 | alpha     | 2011-10-04 | 8
 2 | beta      | 2011-10-04 | 10
 3 | gamma     | 2011-10-04 | 12
 4 | alpha     | 2011-10-03 | 4
 5 | beta      | 2011-10-03 | 6
 6 | gamma     | 2011-10-03 | 8

Ответы [ 2 ]

5 голосов
/ 06 октября 2011
SELECT 
table1.id, table1.`Item Name`,
table1.`Date` AS CurrDate, table1.Price AS CurrPrice,
table2.`Date` AS PrevDate, table2.Price AS PrevPrice,
table1.Price - table2.Price AS Difference
FROM table1
LEFT JOIN table2 ON table1.id = table2.id AND table1.`Date` - INTERVAL 1 DAY = table2.`Date`
ORDER BY Difference DESC

В этом запросе нет ничего особенного, кроме того, как я использовал LEFT JOIN. Я полагаю, что если вчерашние оценки для записи недоступны, последние три столбца будут содержать NULL. Выход:

id | Item Name | CurrDate   | CurrPrice | PrevDate   | PrevPrice | Difference
2  | beta      | 2011-10-05 | 12        | 2011-10-04 | 10        | 2
3  | gamma     | 2011-10-05 | 14        | 2011-10-04 | 12        | 2
1  | alpha     | 2011-10-05 | 10        | 2011-10-04 | 8         | 2
4 голосов
/ 05 октября 2011
SELECT 
  a.price as price1
  , IFNULL(b.price,'(no data)') as price2
  , (a.price - IFNULL(b.price,0)) as difference
FROM table1 a
LEFT JOIN table2 b ON (a.`item name` = b.`item name`)
GROUP BY a.`item name`
HAVING IFNULL(b.`date`,'') = MAX(IFNULL(b.`date`,'')

Вот как это работает.

Выбирает данные из 2 таблиц: все данные из таблицы1 и соответствующие данные из таблицы2.
Если он не может найти совпадающие данные из таблицы 2, он заменит пропущенные строки null значениями. (left join)

Затем он группирует (group by) строк вместе на основе table1.item name.
Это объединяет несколько строк на элемент.
Предложение having исправляет это, выбирая только самые новые строки даты из таблицы 2.

В предложения select и having встроена небольшая поправка для случая, когда в таблице 2 нет данных, соответствующих таблице 1.

Ваш запрос должен быть:

SELECT 
  s.closing as price1
  , IFNULL(sh.closing,'(no data)') as price2
  , (s.closing - IFNULL(sh.closing,0)) as difference 
FROM stocks s 
LEFT JOIN stockhistory sh ON (s.symbol = sh.symbol) 
GROUP BY s.symbol 
HAVING IFNULL(sh.edate,'') = MAX(IFNULL(sh.edate,'')
LIMIT 30 OFFSET 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...