2012-07-10 33 views
1

比方说,我有一个公司,每排结构等之间的存储数据的表:有条件的MySQL选择SUM更改列的符号被总结

(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已经购买的商品的$ 10.00,从公司200和200公司已经购买商品的$ 5.00,从公司100 $ 5.00的总净交易价值。 100公司的净交易价值为300,但不到5.00美元,我对这里的最高价格感兴趣。

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

谢谢!

回答

4

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

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

通过:

这是与这间公司的最高净交易值(100),该公司获得方式,我喜欢你的用户名=)

+0

非常感谢!另外,我没有提到它,但我也对每家公司的总金额感兴趣。对于此问题的任何未来读者,上面的查询可以做如下修改: 'SELECT IF(buyerID = 100,sellerID,buyerID)AS other_company, SUM(IF(buyerID = 100,transactionAmount,transactionAmount * -1))AS netSum 从交易 WHERE 100(buyerID,sellerID) GROUP BY other_company ORDER BY netSum DESC LIMIT 1' – stackunderflow 2012-07-10 06:00:33

+0

@stackunderflow,太棒了!很高兴听到它适合你。我刚刚更新了我的答案,在选择中包含了“SUM”数量。 – 2012-07-10 06:15:52

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 
+0

感谢您的回答。我选择了Zane Bien提交的更简单的查询作为最佳答案,但这一个也是正确的。 – stackunderflow 2012-07-10 06:05:29