2012-01-17 4 views
1

Это последующие действия по сравнению с предыдущими вопросами, которые я задал: Using a GROUP BY statement to sum rows. У меня есть таблица с продажами разных валют, и я использую оператор GROUP BY, чтобы суммировать числа за заголовок.Суммирование продаж по разным валютам в 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_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_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 

Update: Я обновил SQL в этом вопросе.

ответ

1

ОБНОВЛЕНО следующий комментарий

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

Благодарим за отзыв. см. обновленный вопрос. – David542

+0

@ David542 - Хорошо, обновил мой ответ – Lamak

+0

mmm .... нисходящий ни одного комментария – Lamak

1

Я проверил SQL (T-SQL в SQL Server) ниже. Он возвращает 11.5876 как grand_total. Это хорошо для вас?

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, поэтому результат может быть другим.

Обновление: Вот еще один запрос для GBP и SEK. Она возвращает 14.81396 в моей T-SQL:

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

Конверсия должна быть за каждую валюту, а не через всю сумму (строка 4). Кроме того, см. Обновленный вопрос. – David542

+0

@ David542 Я считаю, что «er.currency = rf.partner_share_currency» означает конвертацию за валюту. Я обновил свой ответ. –

+0

Спасибо за обновление - с обновленным вопросом результат должен быть 14,77 (показано выше). – David542

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

В любом случае, я думаю, что есть что-то не так с вашей таблицы продаж. У вас должен быть только один столбец earnings (а не отдельный для каждой валюты). Как видите, для каждой строки вы должны заполнить только один столбец фактическим значением, а остальные равны нулю. Достаточно иметь столбец partner_share_currency и общую колонку earnings.

Смежные вопросы