2016-01-09 2 views
-2

Мне нужно сканировать две таблицы (все строки, где совпадает имя), а затем мне нужно найти МАКСИМАЛЬНУЮ разницу в ценах на продажу и покупку. (максимальная прибыль, которая может быть сделана)Циклический запрос по нескольким строкам

Как я могу найти этот результат строго с помощью mysql? Я хочу, чтобы запрос выполнял расчет.

У меня есть две таблицы:

ПРОДАМ:

Name | Sell_price | Seller 
------------------------ 
Toyota | 12,000  | Mike 
Toyota | 11,000  | Tony 
Toyota | 9,000  | James 
---------------------------- 
Mazda | 5,000  | Craig 
Mazda | 4,000  | Roger 
Mazda | 3,000  | Jones 

Купить:

Name | Buying_Price | Buyer 
------------------------ 
Toyota | 13,000  | Steve 
Toyota | 12,000  | Andy 
Toyota | 10,000  | Charles 
---------------------------- 
Mazda | 5,000  | Thatguy 
Mazda | 4,000  | Dog 
Mazda | 3,500  | Cat 

Результат:

Name |Profit | Buyer | Seller 
---------------------------------- 
Toyota | 2,000 | Charles | Mike 
--------------------------------- 
Mazda | 1,500 | Craig | Cat 
+1

Просьба указать код, который вы пробовали, полученные вами результаты и то, что вам не хватает. –

+0

Я не понимаю, почему вы выбираете Чарльза и Майка для Toyota, а не других имен. Каково ваше правило для выбора рядов на бренд? И я не вижу, что делает Крейга покупателем и Котом продавцом в ваших результатах. Это ошибка или какая-то дополнительная логика? Кроме того: Какова ваша фактическая проблема? Вы, безусловно, знаете, как выбирать из таблиц, как присоединиться, как фильтровать, как агрегировать, так что именно там, где вам нужна помощь? –

+0

@thorstenKettner Это потому, что это самая большая прибыль, которую я мог бы сделать для Toyota (покупка у Чарльза), (продать Майку) даст мне 2000 прибыли. – Edward

ответ

2

Присоединяйтесь таблицы на бренд, а затем отфильтровать только получить максимальную продать и минимальные цены покупки:

select 
    sell.name, 
    sell.sell_price - buy.buying_price as profit, 
    buy.buyer, 
    sell.seller 
from sell 
join buy on buy.name = sell.name 
where (sell.name, sell.sell_price) in 
(
    select name, max(sell_price) 
    from sell 
    group by name 
) 
and (buy.name, buy.buying_price) in 
(
    select name, min(buying_price) 
    from buy 
    group by name 
); 

Или это наоборот, фильтр первого, а затем присоединиться:

select 
    s.name, 
    s.sell_price - b.buying_price as profit, 
    b.buyer, 
    s.seller 
from 
(
    select * 
    from sell 
    where (name, sell_price) in 
    (
    select name, max(sell_price) 
    from sell 
    group by name 
) 
) s 
join 
(
    select * 
    from buy 
    where (name, buying_price) in 
    (
    select name, min(buying_price) 
    from buy 
    group by name 
) 
) b on b.name = s.name; 
1

Вам нужно сравнить каждую строку с каждой другой строки , поэтому OUTER JOIN - твой друг. Затем вы можете сделать расчет в вашем SELECT и использовать AS присвоить имя временного столбца:

SELECT s.name, (s.sell_price - b.buy_price) AS profit, s.seller, b.buyer 
FROM `sell` as s 
OUTER JOIN `buy` as b ON s.name=b.name 

Чтобы затем отсортировать его, вы просто должны использовать ORDER BY:

SELECT s.name, (s.sell_price - b.buy_price) AS profit, s.seller, b.buyer 
FROM `sell` as s 
OUTER JOIN `buy` as b ON s.name=b.name 
ORDER BY profit 

Вы, вероятно, правы не для этого в коде, в зависимости от вашего контекста.

+0

как это набирает наибольшую прибыль #, как в max (buy_price) - min (sell_price) для каждого названия автомобиля. – Edward

+0

@Edward Должен ли это? На этот вопрос не было сказано. –

+0

Извините, что вы правы, но мне нужно получить самую большую цену за разницу, поэтому я не считаю это простым запросом. – Edward

1

Нечто подобное (не проверено):

Выберите s.sell_price - b.buyer_price от продавца в качестве s присоединиться к покупателю, как б на s.name как b.name группе s.name, b.name;

1

A немного модифицированный запрос, но я полагаю, что он дает более точный результат. Если вы делаете расчет своего proffit как продавца, тогда вам нужно выбрать только строки, где цена покупки больше продажной цены.

SELECT s.name, s.sell_price, b.buy_price, (b.buy_price - s.sell_price) AS proffit, s.seller, b.buyer 
FROM `sell` as s 
RIGHT JOIN `buy` as b ON s.name=b.name WHERE b.buy_price > s.sell_price ORDER BY proffit DESC 

и результат будет:

name | proffit | seller | buyer 
-------------------------------------------- 
Toyota | 4,000  | James | Steve 
Mazda | 2,000  | Jones | Thatguy 
Toyota | 1,000  | James | Charlie 
0

По вашей таблице результатов, и нужно, чтобы получить только те записи, которые имеют прибыль без каких-либо повреждений. Вы можете попробовать, как этот.

SELECT s.Name, (s.Sell_Price-b.Buying_Price) AS Profit, b.Buyer, s.Seller 
FROM Sell s RIGHT JOIN Buy b ON s.Name=b.Name 
WHERE b.Buying_Price > s.Sell_Price; 
Смежные вопросы