MySQL使用条件选择SUM以更改要求的列的符号

时间:2012-07-10 00:01:51

标签: mysql sql

假设我有一个表存储公司之间的交易,每行的结构如下:

(int) buyerId | (int) sellerId | (float) transactionAmount

我想获取一个特定的公司ID,并找出他们拥有最多片面的净交易历史的公司。例如,公司A的ID为100.我想找出哪个公司的销售净值最高 - 购买。如果表数据如下:

buyerID     sellerId    transactionAmount
100         200         10.00
200         100         5.00
100         300         1.00

公司100从公司200购买了10.00美元的商品,公司200从公司100购买了5.00美元的商品,总净交易价值为5.00美元。公司100的净交易价值为1.00,公司300,但不到5.00美元,我对这里的最大值感兴趣。

我是否可以使用MySQL查询来查找$ 5.00总和($ 10.00 +( - $ 5.00)),其中transactionAmount字段中的值可以更改为正/负,具体取决于哪个公司是买方,哪个公司是卖家?或者我是否需要获取所有相关行并在代码中计算此最大值?

谢谢!

2 个答案:

答案 0 :(得分:5)

您可以使用这个更简单的解决方案:

这使得该公司具有与该特定公司(100)具有最高净交易价值的公司:

SELECT 
    IF(buyerID = 100, sellerID, buyerID) AS other_company,
    SUM(IF(buyerID = 100, transactionAmount, transactionAmount * -1)) AS netSum
FROM transactions
WHERE 100 IN (buyerID, sellerID)
GROUP BY other_company
ORDER BY netSum DESC
LIMIT 1

SQL-Fiddle Demo

顺便说一下,我喜欢你的用户名=)

答案 1 :(得分:1)

如果您将有问题的公司是卖方的所有记录与买方所在的记录合并,但是切换了transactionAmount的标志,那么剩下要做的就是按金额对结果进行求和。这是TEST @ SQL FIDDLE

select partner, 
       sum(Amount) Amount
from
(
  select sellerid Partner, 
         sum(transactionAmount) Amount
    from Table1
   where buyerid = 100
   group by sellerid
  union all
  select buyerid, 
         -sum(transactionAmount) Amount
    from Table1
   where sellerid = 100
   group by buyerid
) t
group by partner
order by Amount desc
limit 1