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'