Mysql 使用SQL对不同货币的销售额求和

Mysql 使用SQL对不同货币的销售额求和,mysql,sql,Mysql,Sql,这是我之前问过的一个问题的后续内容:。我有一个不同货币的销售表,我用分组对账单来汇总每个标题的数字 mysql> SELECT title, SUM(us_earnings_usd) AS usd, SUM(cad_earnings_cad) AS cad, SUM(uk_earnings_gbp) AS gbp, SUM(swedish_earnings_skk) AS skk FROM raw_fin

这是我之前问过的一个问题的后续内容:。我有一个不同货币的销售表,我用分组对账单来汇总每个标题的数字

mysql> SELECT
       title, 
       SUM(us_earnings_usd) AS usd,
       SUM(cad_earnings_cad) AS cad,
       SUM(uk_earnings_gbp) AS gbp,
       SUM(swedish_earnings_skk) AS skk
       FROM raw_financials 
       WHERE date="2012-12-01"
       GROUP BY title

+--------+-----------------+------------------+------------------+------------------+
| title  | us_earnings_usd | cad_earnings_cad |swedish_earnings_ |  uk_earnings_gbp |
+--------+-----------------+------------------+------------------+------------------+
| Gamers |          7.7500 |           4.0000 |           1.0000 |           2.0000 |
+--------+-----------------+------------------+------------------+------------------+
最后,我需要对字段进行汇总,以获得以美元表示的总销售额。为此,我有一个额外的表,名为
exchange\u rates
。这是如何查询的:

mysql> SELECT currency, conversion_to_usd FROM exchange_rates WHERE date="2011-12-01";

+----------+-------------------+
| currency | conversion_to_usd |
+----------+-------------------+
| AUD      |           0.98542 |
| CAD      |           0.95940 |
| CHF      |           1.05235 |
| DKK      |           0.17372 |
| EUR      |           1.29400 |
| GBP      |           1.54223 |
| NOK      |           0.16579 |
| NZD      |           0.74442 |
| SEK      |           0.14190 |
| USD      |           1.00000 |
+----------+-------------------+
我将如何使用SQL组合这些内容以获得:

total_earnings_in_usd = 7.75 (earnings in usd) *1.00 (conversion from usd to usd) 
                        + 4.00 (earnings in cad) *0.95 (conversion from cad to usd) 
                        + 1.00 (earnings in sek) *0.14 (conversion from sek to usd)
                        + 2.00 (earnings in gbp) *1.54 (conversion from gbp to usd) 
                      = $14.77 USD

更新:我已经更新了问题中的SQL。

更新了以下评论

SELECT  title, 
        partner_share_currency,
        SUM(us_earnings_usd) AS usd,
        SUM(cad_earnings_cad) AS cad,
        SUM(us_earnings_usd) + SUM(cad_earnings_cad*CAD) +
        SUM(uk_earnings_gbp*GBP) + SUM(swedish_earnings_skk*SEK) total_earnings_in_usd
FROM raw_financials rf
LEFT JOIN ( SELECT  date, 
                    MIN(CASE WHEN  currency = 'CAD' THEN conversion_to_usd END) CAD,
                    MIN(CASE WHEN  currency = 'GBP' THEN conversion_to_usd END) GBP,
                    MIN(CASE WHEN  currency = 'SEK' THEN conversion_to_usd END) SEK
            FROM exchange_rates 
            WHERE currency IN ('CAD','GBP','SEK')
            GROUP BY date) er
ON rf.date = er.date
WHERE title LIKE '%Gamers%' AND rf.date= '2012-12-01'
GROUP BY title
我在下面测试了SQL(SQLServer中的T-SQL)。它返回总计11.5876。这对你合适吗

create table #raw_financials (
    title varchar(20)
    ,partner_share_currency varchar(20)
    ,us_earnings_usd decimal(15, 5)
    ,cad_earnings_cad decimal(15, 5)
    ,date datetime
)
insert into #raw_financials values ('Gamers', 'USD', 3.25, 0, '2012-12-01')
insert into #raw_financials values ('Gamers', 'CAD', 0, 4, '2012-12-01')
insert into #raw_financials values ('Gamers', 'USD', 4.5, 0, '2012-12-01')

create table #exchange_rates (
    currency varchar(20)
    ,conversion_to_usd decimal(15, 5)
    ,date datetime
)
insert into #exchange_rates values ('CAD', 0.95940, '2012-12-01')
insert into #exchange_rates values ('USD', 1, '2012-12-01')

SELECT
rf.title,
--partner_share_currency,
SUM((rf.us_earnings_usd + rf.cad_earnings_cad) * er.conversion_to_usd) AS grand_total
FROM #raw_financials rf
INNER JOIN #exchange_rates er
ON er.currency = rf.partner_share_currency
AND er.date = rf.date
WHERE rf.title LIKE '%Gamers%' AND rf.date='2012-12-01'
GROUP BY rf.title
但我从未使用过MySQL,因此结果可能会有所不同

更新:这里是对英镑和瑞典克朗的另一个查询。它在我的T-SQL中返回14.81396:

create table #raw_financials (
    title varchar(20)
    ,partner_share_currency varchar(20)
    ,us_earnings_usd decimal(15, 5)
    ,cad_earnings_cad decimal(15, 5)
    ,uk_earnings_gbp decimal(15, 5)
    ,swedish_earnings_skk decimal(15, 5)
    ,date datetime
)
insert into #raw_financials values ('Gamers', 'USD', 3.25, 0, 0, 0, '2012-12-01')
insert into #raw_financials values ('Gamers', 'CAD', 0, 4, 0, 0, '2012-12-01')
insert into #raw_financials values ('Gamers', 'USD', 4.5, 0, 0, 0, '2012-12-01')
insert into #raw_financials values ('Gamers', 'GBP', 0, 0, 2, 0, '2012-12-01')
insert into #raw_financials values ('Gamers', 'SEK', 0, 0, 0, 1, '2012-12-01')

create table #exchange_rates (
    currency varchar(20)
    ,conversion_to_usd decimal(15, 5)
    ,date datetime
)
insert into #exchange_rates values ('CAD', 0.95940, '2012-12-01')
insert into #exchange_rates values ('USD', 1, '2012-12-01')
insert into #exchange_rates values ('GBP', 1.54223, '2012-12-01')
insert into #exchange_rates values ('SEK', 0.14190, '2012-12-01')

SELECT
rf.title,
SUM((rf.us_earnings_usd + 
     rf.cad_earnings_cad + 
     rf.uk_earnings_gbp + 
     rf.swedish_earnings_skk
    ) * er.conversion_to_usd) AS grand_total
FROM #raw_financials rf
INNER JOIN #exchange_rates er
ON er.currency = rf.partner_share_currency
AND er.date = rf.date
WHERE rf.title LIKE '%Gamers%' AND rf.date='2012-12-01'
GROUP BY rf.title

无论如何,我认为你们的销售表有问题。您应该只有一个
earnings
列(而不是每种货币都有一个单独的列)。如您所见,对于每一行,您只需用实际值填充一列,其余为零。只要有
partner\u share\u currency
一栏和通用
earnings
一栏就足够了。

转换应该是每种货币,而不是所有货币的总和(第4行)。另外,请参阅更新的问题。@David542我相信“er.currency=rf.partner\u share\u currency”是指每种货币的转换。我更新了我的答案。谢谢你的更新——对于更新后的问题,结果应该是14.77(如上所示)。@David542你试过我的查询了吗?您在问题Rev.1中预期为11.55。所以我觉得我的查询很好@大卫542嗨,我又加了一个例子。它看起来对我来说几乎很好。
SELECT
    t.title, 
    t.usd,
    t.cad,
    t.gbp,
    t.skk,
    t.usd + t.cad*er_cad.conversion_to_usd + t.gbp*er_gbp.conversion_to_usd + t.skk*er_skk.conversion_to_usd AS total
FROM
(
    SELECT
        title, 
        SUM(us_earnings_usd) AS usd,
        SUM(cad_earnings_cad) AS cad,
        SUM(uk_earnings_gbp) AS gbp,
        SUM(swedish_earnings_skk) AS skk,
        FROM raw_financials 
        WHERE date="2012-12-01"
        GROUP BY title
) t
INNER JOIN exchange_rates er_cad ON er_cad.date = t.date and er_cad.currency = 'CAD'
INNER JOIN exchange_rates er_gbp ON er_gbp.date = t.date and er_gbp.currency = 'GBP'
INNER JOIN exchange_rates er_skk ON er_skk.date = t.date and er_skk.currency = 'SKK'