2015-04-23 38 views
1

我有以下购买和出售货币对和它们的价值在一张桌子上,我试图写一个小的选择语句,获得每对的总数,但是当对有对立面时,他们可以互相扣除,例如,卖出任何欧元都没有意义,因为它可以用来抵消部分买入欧元。所以,这两条线英镑/欧元,欧元/英镑将成为: 注意对可能不仅EUR/GBP匹配所以不能在MySQL总结了两个相反的货币对

EUR 852.07 GBP -636.1 

被硬编码(也许侧重于减少量买就是要走的路?)

我很想给你举个例子,但我完全卡住了!任何想法,不胜感激。

Buy    Sell 
ccy amt  ccy amt 
EUR, 1409.7600, AUD, -1965.4900 
GBP, 2801.8500, AUD, -5446.5100 
EUR, 1116.2800, CAD, -1472.1500 
EUR, 4862.2000, CHF, -5013.9000 
GBP, 3937.6700, CHF, -5661.5700 
EUR, 2066.8900, DKK, -15505.0000 
GBP, 1688.7200, DKK, -17640.6400 
** 
GBP, 1986.4400, EUR, -2778.7500 
EUR, 3630.8200, GBP, -2622.5400 
** 
EUR, 358.4100, NOK, -3046.6600 
GBP, 2865.9800, NOK, -33965.5900 
EUR, 1574.9800, SEK, -14746.0600 
GBP, 1511.3100, SEK, -19727.5900 
EUR, 724.3600, USD, -777.8900 
GBP, 34.7400, USD, -52.0200 


ccy = currency char(3) 
amt = amount decimal 

最终结果应该如下所示。

Buy    Sell 
ccy amt  ccy amt 
EUR, 1409.7600, AUD, -1965.4900 
GBP, 2801.8500, AUD, -5446.5100 
EUR, 1116.2800, CAD, -1472.1500 
EUR, 4862.2000, CHF, -5013.9000 
GBP, 3937.6700, CHF, -5661.5700 
EUR, 2066.8900, DKK, -15505.0000 
GBP, 1688.7200, DKK, -17640.6400 
** 
EUR, 852.07  GBP, -636.1 
** 
EUR, 358.4100, NOK, -3046.6600 
GBP, 2865.9800, NOK, -33965.5900 
EUR, 1574.9800, SEK, -14746.0600 
GBP, 1511.3100, SEK, -19727.5900 
EUR, 724.3600, USD, -777.8900 
GBP, 34.7400, USD, -52.0200 
+0

这个表的模式将是... ??? – dbinns66

+0

对不起,我认为这很明显;添加了一个快速架构 – Christian

+0

实际上这些是数据类型,该计划(请参阅我的答案)将包括表名称,列名称,列类型等 – dbinns66

回答

0

尝试这样的事情,并假设你使用PHP ...

$sql = " 
select 
    sum( 
    case 
     when buy_currency = '$currency_one' then buy_amount 
     when sell_currency = '$currency_one' then sell_amount 
    end 
) as first_currency, 
    sum( 
    case 
     when buy_currency = '$currency_twp' then buy_amount 
     when sell_currency = '$currency_two' then sell_amount 
    end 
) as second_currency 
from test"; 

假设模式一样

CREATE TABLE `test` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `buy_currency` VARCHAR(50) NOT NULL DEFAULT '0', 
    `buy_amount` VARCHAR(50) NOT NULL DEFAULT '0', 
    `sell_currency` VARCHAR(50) NOT NULL DEFAULT '0', 
    `sell_amount` VARCHAR(50) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) 
COLLATE='latin1_swedish_ci' 
ENGINE=InnoDB 
AUTO_INCREMENT=6 
; 
+1

一样唯一,只会给出总数而不是组对。实际上,它提供了'first_currency 12964.9500,second_currency 12204.1700' – Christian

+0

好 - 谢谢你的想法。答案实际上必须是动态的(因此欧元,英镑无法得到硬代码),并且还必须考虑所有其他配对。 – Christian

+0

更新为一个PHP变量作为货币指标的例子... – dbinns66

1

试试这个:

SELECT SUM(CASE 
      WHEN `ccy_buy` = 'EUR' AND `ccy_sell` = 'GBP' THEN `amt_buy` 
      WHEN `ccy_sell` = 'EUR' AND `ccy_buy` = 'GBP' THEN `amt_sell` 
     END 
    ) AS `ccy1`, 
     SUM(CASE 
      WHEN `ccy_buy` = 'GBP' and `ccy_sell` = 'EUR' THEN `amt_buy` 
      WHEN `ccy_sell` = 'GBP' and `ccy_buy` = 'EUR' THEN `amt_sell` 
     END 
    ) AS `ccy2` 
    FROM `test` 

您可能想要将其包装到一个存储过程中并通过这两个货币作为参数,像这样:

DELIMITER ;; 
CREATE PROCEDURE `sp_compareCurrencyPairs`(IN pCur1 CHAR(3), IN pCur2 CHAR(3)) 
    READS SQL DATA 
BEGIN 
    SELECT SUM(CASE 
      WHEN `ccy_buy` = pCur1 AND `ccy_sell` = pCur2 THEN `amt_buy` 
      WHEN `ccy_sell` = pCur1 AND `ccy_buy` = pCur2 THEN `amt_sell` 
     END 
    ) AS `ccy1`, 
     SUM(CASE 
      WHEN `ccy_buy` = pCur2 AND `ccy_sell` = pCur1 THEN `amt_buy` 
      WHEN `ccy_sell` = pCur2 AND `ccy_buy` = pCur1 THEN `amt_sell` 
     END 
    ) AS `ccy2` 
    FROM `test`; 
END;; 
DELIMITER ; 

然后使用它是这样的:

CALL `sp_compareCurrencyPairs`('GBP', 'EUR'); 
+0

这是一个有趣的想法,我尝试了很多变化,但它从未给出正确的结果。答案实际上必须是动态的(因此不能在欧元和英镑中使用硬代码),并且还必须考虑所有其他配对 – Christian

+0

因此,您需要查询一次返回所有配对结果,或一次只返回一对吗?看看我的编辑与存储过程。我在本地用你的例子中的数据尝试过它,它似乎返回你所期望的。 – Juan

+0

这将是一个很好的拍摄,否则我可以把它拉进蟒蛇,并在那里做 – Christian

2

我不得不稍微改变您的列名,以反映有在同为多CCY和AMT的事实记录。

SELECT 
a.buy_ccy, 
SUM(a.buy_amt) + COALESCE(SUM(b.sell_amt),0) as buy_amt, 
a.sell_ccy, 
SUM(a.sell_amt) + COALESCE(SUM(b.buy_amt),0) as sell_amt 
FROM 
transactions as a 
LEFT OUTER JOIN transactions as b ON (a.buy_ccy = b.sell_ccy AND a.sell_ccy = b.buy_ccy) 
GROUP BY 
a.buy_ccy, 
b.buy_ccy, 
a.sell_ccy, 
b.sell_ccy 
HAVING buy_amt > 0; 

例子:http://sqlfiddle.com/#!9/f2006/3

+0

这是我一直试图做到这一点的方式。将尝试一下。就在我回家的路上。 – Christian

+0

当我运行这个时,我得到了'GBP 714.24 EUR -1074.61' – Christian

+0

请参阅我提供的链接。你的设置有什么不同? – trex005

0

http://sqlfiddle.com/#!9/d5198/1

SELECT 
    IF(buy_ccy>sell_ccy,buy_ccy,sell_ccy) as buy_ccy, 
    SUM(IF(buy_ccy>sell_ccy,buy_amt,sell_amt)) as buy_amt, 
    IF(buy_ccy>sell_ccy,sell_ccy,buy_ccy) as sell_ccy, 
    SUM(IF(buy_ccy>sell_ccy,sell_amt,buy_amt)) as sell_amt 
FROM EXCHANGE 
GROUP BY IF(buy_ccy>sell_ccy,CONCAT(buy_ccy,sell_ccy),CONCAT(sell_ccy,buy_ccy)) 
+0

这确实是一个有趣的方法,但它往往使买入否定和卖出积极。 – trex005

+0

负面或正面,但它对于所有记录必须是相同的规则。因此要更改查询,您只需将自己的规则应用于查询即可。所以如果两者都是正数,那么可以将SUM(IF(buy_ccy> sell_ccy,buy_amt,-sell_amt))作为buy_amt, – Alex