1

各行が次のように構造化された企業間のトランザクションを格納するテーブルがあるとします。

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

特定の会社IDを取得して、一方的なネット取引履歴が最も多い会社を見つけたいと思います。たとえば、会社AのIDは100です。SA​​LES-PURCHASESの正味価値が最も高い会社を調べたいと思います。テーブルデータが次の場合:

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の会社300との正味取引額も1.00ですが、これは$ 5.00未満であり、ここで最大値に関心があります。

この$5.00の合計($ 10.00 +(-$ 5.00))を見つけるために使用できるMySQLクエリはありますか?transactionAmountフィールドの値は、購入者と販売者に応じて正/負に変更できますか?または、関連するすべての行をフェッチして、この最大値をコードで計算する必要がありますか?

ありがとう!

4

2 に答える 2

6

このより単純なソリューションを使用できます。

これにより、この特定の会社 (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 フィドルのデモ

ところで、私はあなたのユーザー名が好きです =)

于 2012-07-10T01:43:12.767 に答える
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
于 2012-07-10T00:14:45.260 に答える