2016-01-09 56 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

请显示您尝试过的一些sql代码,您得到的结果以及您错过的内容。 –

+0

我不明白你为什么选择丰田而不是其他任何名字的查尔斯和迈克。每个品牌选择行的规则是什么?我没有看到什么让克雷格成为买家,猫是卖家的成果。这是一个错误还是一些额外的逻辑?除此之外:你的实际问题是什么?您当然知道如何从表格中选择,如何加入,如何过滤,如何汇总,那么您究竟需要哪些帮助? –

+0

@thorstenKettner这是因为这是我可以为丰田做的最大利润(卖给查尔斯),(卖给迈克)给我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

@爱德华应该吗?这个问题实际上没有提到。 –

+0

对不起,你是对的,但是是啊,我需要得到最大的差异价格,这就是为什么它不是一个简单的查询,我相信 – Edward

1

喜欢的东西(未测试):

选择s.sell_price - 从卖方为s由s.name,b.name上s.name加入买方为b像b.name组b.buyer_price;

1

一一点点修改后的查询,但我想这是给更精确的结果。 如果您正在计算您的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

根据您的结果表,U盘需要检索只有中没有任何损失的利润记录。你可以尝试像这样。

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;