Кирилл
|
7 декабря 2013 20:12
|
Admin Пишет: Именно так.
Ну раз вы специалист и вам интересно, то приведите пример такого запроса с простым джойном и перемножением. Может быть откроете нам глаза и мы быстро всё сделаем :). Не знаю как будет работать на больших объемах, но принцип у меня супер примитивный.
Вот по ссылке можно посмотреть работу http://sqlfiddle.com
DDL:
CREATE TABLE ExchangeRates(DateID DATE, ToCurrencyID INT(4), FromCurrencyID INT(4), Rate FLOAT(16,8));
CREATE TABLE Expenses(DateID DATE, CurrencyID INT(4), Val FLOAT(25,8));
INSERT ExchangeRates VALUES ('2013-12-05',840,974,(10000/35.3488)*33.2632);
INSERT ExchangeRates VALUES ('2012-11-24',840,974,(10000/36.4123)*31.1325);
INSERT ExchangeRates VALUES ('2012-11-24',840,980,(10/38.1877)*31.1325);
INSERT ExchangeRates VALUES ('2013-10-01',840,840,1);
INSERT Expenses VALUES ('2013-12-05', 974, 50000000);
INSERT Expenses VALUES ('2013-12-05', 974, 300000000);
INSERT Expenses VALUES ('2013-10-01', 840, 400);
INSERT Expenses VALUES ('2012-11-24', 980, 1500);
INSERT Expenses VALUES ('2012-11-24', 974, 60000000);
Запросы:
select sum(e.val/r.rate) from expenses e LEFT OUTER JOIN exchangerates r
ON e.DateID=r.DateID and e.CurrencyID=r.FromCurrencyID and r.ToCurrencyID=840;
select e.*,r.rate, e.val/r.rate from expenses e LEFT OUTER JOIN exchangerates r
ON e.DateID=r.DateID and e.CurrencyID=r.FromCurrencyID and r.ToCurrencyID=840;
Сорри, я не использовал mysql уже лет 7 и ничего не помню, прошу учитывать) Таблица с курсами будет очень большая, но с нормальным индексом должна работать. Способ примитивный. Могу подумать, чтобы считалось используя только курсы ЦБ РФ относительно рубля, т.е. 35 курсов.
|
|
|
Кирилл
|
7 декабря 2013 20:59
|
Вот вариант вычислений без большой таблицы.
вероятно по этой ссылке сайтик будет с заполненным кодом: http://sqlfiddle.com/#!2/eeec1/2/0
Если нет, вбивайте запросы сюда http://sqlfiddle.com
DDL:
CREATE TABLE Expenses(DateID DATE, CurrencyID INT(4), Val FLOAT(25,8));
CREATE TABLE Rates(DateID DATE, CurrencyID INT(4), RateToRUR FLOAT(16,8));
INSERT Rates VALUES ('2013-12-05',840,33.2632);
INSERT Rates VALUES ('2013-12-05',974,35.3488/10000);
INSERT Rates VALUES ('2012-11-24',840,31.1325);
INSERT Rates VALUES ('2012-11-24',974,36.4123/10000);
INSERT Rates VALUES ('2012-11-24',980,38.1877/10);
INSERT Rates VALUES ('2013-10-01',840,32.4839);
INSERT Expenses VALUES ('2013-12-05', 974, 50000000);
INSERT Expenses VALUES ('2013-12-05', 974, 300000000);
INSERT Expenses VALUES ('2013-10-01', 840, 400);
INSERT Expenses VALUES ('2012-11-24', 980, 1500);
INSERT Expenses VALUES ('2012-11-24', 974, 60000000);
Запросы:
select sum(e.Val*r1.RateToRur/r2.RateToRur) from expenses e
LEFT OUTER JOIN rates AS r1
ON e.DateID=r1.DateID and e.CurrencyID=r1.CurrencyID
LEFT OUTER JOIN rates AS r2
ON e.DateID=r2.DateID and r2.CurrencyID=840;
select * from rates;
select e.*,r1.RateToRur AS R1,r2.RateToRur AS R2, e.Val*r1.RateToRur/r2.RateToRur from expenses e
LEFT OUTER JOIN rates AS r1
ON e.DateID=r1.DateID and e.CurrencyID=r1.CurrencyID
LEFT OUTER JOIN rates AS r2
ON e.DateID=r2.DateID and r2.CurrencyID=840;
select * from rates;
|
|
|
Admin
|
7 декабря 2013 21:20
|
Кирилл Пишет: Не знаю как будет работать на больших объемах Никак не будет. И скорее всего другой вариант тоже. У нас пользователи вправе заводить свои валюты и сами устанавливать курсы.
Если умножить наш объём пользователей на кол-во валют на кол-во дней в году и на несколько лет, то получится такой объём, что когда кто-то один запустит такой отчёт, все остальные могут идти пить кофе.
Но за идею спасибо, возможно как-то получится поэкспериментировать и что-нибудь добиться в этом направлении. Может что-то придумаем в каком-то урезанном виде, только для некоторых валют и ещё с парочкой каких-нибудь ограничений.
|
|
|
Кирилл
|
8 декабря 2013 11:33
|
Admin Пишет: Никак не будет. И скорее всего другой вариант тоже. У нас пользователи вправе заводить свои валюты и сами устанавливать курсы.
Мне кажется, второй вариант вполне реалистичен, и его можно сделать опционально для тех, кому очень надо. Кому не надо, пускай ставят свои курсы или используют сегодняшний курс. Затянуть исторические данные в нужном виде для центробанка России из 35 валют за 10 лет - это не так уж и много. Проверьте плз такой запрос. Если вы напишете, что такой двойной джоин на инфе за 5-6 лет неподъемен - мне придется смириться.
Можете кстати сделать такой пункт отчетов - только в платной версии)
Второй вариант - в табличке трат добавить поле суммы в валюте. Сумму отчетности выбрать в настройках. И в отчетности использовать уже это поле.
Третий вариант - сделать отчет трат и доходов по месяцам и годам (как это сделано в отчетах справа - очень удобная штука), где сохранялиьс бы предрасчитанные значения, которые например 1 раз в месяц обновляются. Можно даже сделать это как отчет на е-мэйл по прошествую месяца. Я бы даже доплачивал 50-100 руб к подписке за подобный отчет ежемесячный отчет, который сам приходит. Там например структура расходов-доходов за месяц и правильно посчитанный баланс доходов-расходов по месяцам и годам.
|
|
|
Ilyan
|
8 декабря 2013 18:27
|
Admin Пишет: Никак не будет. И скорее всего другой вариант тоже. У нас пользователи вправе заводить свои валюты и сами устанавливать курсы. Готов поспорить, что на всех пользователей дребеденег не более нескольких тысяч валют.
А если автоматически поддерживать не только валюты ЦБР, но и ещё несколько десятков более экзотических, то это число сократится до считаных сотен.
Но даже несколько тысяч валют - это около миллиона строк в год - т.е. полная таблица будет сравнима с общим количеством транзакций в базе.
Плюс оптимизации:
1. Обычно >90% операций сделаны в валюте отчета и не требуют пересчета.
2. Обычно >90% отчетов не выходят за последние 6 месяцев.
Вы говорите "скорее всего" - это значит, что за последние 4 года вы его не даже попробовали? Не посмотрели сколько времени берет примитивная реализация? Не прикидывали, где можно улучшить?
|
|
|
Ilyan
|
8 декабря 2013 18:32
|
Да в конце концов - один раз посчитать и потом хранить для каждой транзакции её сумму в основной валюте пользователя - ведь 99.9% отчетов делаются именно с пересчетом в неё.
|
|
|
Ilyan
|
8 декабря 2013 18:40
|
Admin Пишет: Но за идею спасибо, возможно как-то получится поэкспериментировать и что-нибудь добиться в этом направлении. За 4 года вы не попробовали даже самый примитивный вариант.
Злодеи... :)
|
|
|
Maxim Hegel
|
20 декабря 2013 12:57
|
Admin Пишет: Никак не будет. И скорее всего другой вариант тоже. У нас пользователи вправе заводить свои валюты и сами устанавливать курсы. Вообще не понимаю в чём проблема, завести отдельную таблицу на пользователя (семью) с его личными курсами.
Например, имеем на входе:
• 20 валют
• 20 лет
• 365 дней в году
Итого 20*20*365 = 146 000 - с таким объёмом справится любой нормальный скуль сервер, даже не заметив!
И привёл очень пессимистичный вариант, у 90% пользователей этот объём не будет превышать и 30 тыс. записей.
Может просто проблема в серверных мощностях или всё таки в нежелании делать?
|
|
|
medved
|
26 декабря 2013 10:56
|
Админ,
Как продвигаются дела в этом направлении? Или никак?
Итоги года проанализировать невозможно:(. К сожалению в нашей стране в начале года курс был 1USD - 8600BYR, а к концу 1USD - 9500.
Если будет история курсов, тут же куплю премиум подписку:)
|
|
|
Admin
|
26 декабря 2013 11:33
|
medved Пишет: Как продвигаются дела в этом направлении? Запланировано пока поэкспериментировать с этим вопросом, возможно в начале следующего года руки дойдут. Если результаты в каком-то виде будут пригодны - прикрутим.
|
|
|
medved
|
26 декабря 2013 11:47
|
Admin Пишет: medved Пишет:Как продвигаются дела в этом направлении?Запланировано пока поэкспериментировать с этим вопросом, возможно в начале следующего года руки дойдут. Если результаты в каком-то виде будут пригодны - прикрутим. Отлично, будем надеется, что получится.
|
|
|
Admin
|
20 января 2014 15:59
|
Прикручено, проверяйте. История курсов берётся внешняя, т.е. пользовательское изменение курсов игнорируется.
Спасибо Кириллу за идею, она оказалась работоспособной.
Заодно ушли от курсов ЦБ РФ, т.е. теперь при желании можно добавить в автообновление (и стало быть историю) любую из 160 валют мира.
|
|
|
Кирилл
|
20 января 2014 20:52
|
Admin Пишет: Прикручено, проверяйте. История курсов берётся внешняя, т.е. пользовательское изменение курсов игнорируется. Спасибо Кириллу за идею, она оказалась работоспособной. Заодно ушли от курсов ЦБ РФ, т.е. теперь при желании можно добавить в автообновление (и стало быть историю) любую из 160 валют мира. Супер! Спасибо огромнейшее! Проверил по среднегодовому курсу общие годовые расходы с 2008. Очень все точно получается. Офигенно. Сейчас видна реальная статистика! Молодцы!
Рекомендую подумать над ежемесячным письмом рассылкой с графиками и важными цифрами на е-мэйл для платных экаунтов. Было бы полезно раз в месяц смотреть отчеты и специально никуда не ходить.
|
|
|
Кирилл
|
20 января 2014 21:01
|
Идеи для инфографики:
- Общий доход - общий расход (сравнение с прошлыми тремя месяцами, годом + среднемесячный за всю историю)
- Общие остатки на начало месяца, на конец месяца
- Сумма по топ 3 тегам
- Топ5 трат
- Суммы по Топ3 самых частых категорий за месяц
- Выполнение месячных планов
- Топ5 долгов
- Топ5 остатков (положительных\отрицательных) по местам хранения
- Изменение по доходам по топ3 категориям доходов (сравнение с прошлыми тремя месяцами, годом + среднемесячный за всю историю)
Фантазии нету предела))
Желательно чтобы в настройках можно было выбрать что именно должно включаться в очет.
|
|
|
Алексей
|
21 января 2014 10:25
|
Наконец-то!! Ура! Спасибо!
|
|
|
zvuk_on
|
21 января 2014 10:48
|
Спасибо огромное! продолжим премиум-подписку :)
|
|
|
medved
|
22 января 2014 23:23
|
Admin Пишет: Прикручено, проверяйте. История курсов берётся внешняя, т.е. пользовательское изменение курсов игнорируется. Спасибо Кириллу за идею, она оказалась работоспособной. Заодно ушли от курсов ЦБ РФ, т.е. теперь при желании можно добавить в автообновление (и стало быть историю) любую из 160 валют мира. Огромное спасибо за решение этой насущной проблемы!!!
Сегодня добрались руки проверить. К сожалению обнаружил довольно большие расхождения.
Например:
1) за 2011 год сумма в белорусских рублях конвертированная в доллары по курсу нацбанка нашей страны в этот день равна 293 USD, а в отчете дребеденьгах показывает 430. Проверил различные даты 2011 года, везде такие большие разбежки, в каждом месяце.
2) За 2012 год разбежки уже не такие большие, порядка 5 долларов на 1000.
3) За 2013 год разбежки ещё меньше, порядка 1 доллара на 2000.
Как бы это проверить?
|
|
|
Admin
|
23 января 2014 11:44
|
medved Пишет: за 2011 год сумма в белорусских рублях конвертированная в доллары по курсу нацбанка нашей страны в этот день равна 293 USD Сформируйте отчёт "детально", чтобы были видны конкретные траты в пересчёте на USD. Найдите те, у которых есть расхождения, и проверьте курс на день совершения операции. И приведите пример конкретной операции, которая пересчиталась не верно. Будем смотреть.
|
|
|
medved
|
23 января 2014 13:38
|
Admin Пишет: medved Пишет:за 2011 год сумма в белорусских рублях конвертированная в доллары по курсу нацбанка нашей страны в этот день равна 293 USDСформируйте отчёт "детально", чтобы были видны конкретные траты в пересчёте на USD. Найдите те, у которых есть расхождения, и проверьте курс на день совершения операции. И приведите пример конкретной операции, которая пересчиталась не верно. Будем смотреть. Так собствено говоря я так и делал. Проверил кучу операций, сравнивал с курсом по нац. банку рб. Выше я приводил конкртное расхождение по одной операции. Какие сведения необходимо уточнить для Вас?
|
|
|
Admin
|
23 января 2014 14:48
|
medved Пишет: Какие сведения необходимо уточнить для Вас? Дату не правильной операции, сумму в BYR, сумму в USD, курс к BYR который должен быть.
|
|
|
medved
|
23 января 2014 22:52
|
Admin Пишет: medved Пишет:Какие сведения необходимо уточнить для Вас?Дату не правильной операции, сумму в BYR, сумму в USD, курс к BYR который должен быть. 1) 03.06.2011
Сумма в BYR - 1294680
Сумма в USD - 259,9
Курс к BYR - 4981
Сумма в дребеденьгах в USD - 322,53
2) 04.11.2011
Сумма в BYR - 2534980
Сумма в USD - 293
Курс к BYR - 8650
Сумма в дребеденьгах в USD - 429.93
|
|
|
Admin
|
24 января 2014 16:06
|
medved Пишет: 03.06.2011 У вас нет трат за указанные даты. Может быть вы смотрите под другим логином?
Пришлите скриншот, если можно.
|
|
|
medved
|
24 января 2014 18:57
|
Admin Пишет: medved Пишет:03.06.2011 У вас нет трат за указанные даты. Может быть вы смотрите под другим логином? Пришлите скриншот, если можно. Это из дохода.
|
|
|
Admin
|
24 января 2014 20:59
|
medved Пишет: Это из дохода. Нет вообще ни одной транзакции за эти даты, проверьте ещё раз внимательнее.
Если есть - убедитесь, что логин пользователя ваш и покажите скриншот, где видно эти транзакции.
|
|
|
medved
|
24 января 2014 21:19
|
Admin Пишет: medved Пишет:Это из дохода.Нет вообще ни одной транзакции за эти даты, проверьте ещё раз внимательнее. Если есть - убедитесь, что логин пользователя ваш и покажите скриншот, где видно эти транзакции. Извиняюсь. Логин medved это только для форума. Свой настоящий не хотелось бы писать прямо здесь на форуме.
|
|
|
Admin
|
24 января 2014 21:22
|
medved Пишет: Свой настоящий не хотелось бы писать Пришлите в обратную связь.
|
|
|
Admin
|
25 января 2014 12:22
|
medved Пишет: 03.06.2011
Сумма в BYR - 1294680
Сумма в USD - 259,9
Курс к BYR - 4981 Нашлось, посмотрели, всё вроде верно. По данным сайта openexchangerates.org курс на тот день был равен 4014.118571 BYR за 1 USD.
Уточните, цифра 4981 у вас откуда?
|
|
|
medved
|
25 января 2014 12:28
|
Admin Пишет: medved Пишет:03.06.2011 Сумма в BYR - 1294680 Сумма в USD - 259,9 Курс к BYR - 4981Нашлось, посмотрели, всё вроде верно. По данным сайта openexchangerates.org курс на тот день был равен 4014.118571 BYR за 1 USD. Уточните, цифра 4981 у вас откуда? Цифра с сайта нац банка РБ.
http://www.nbrb.by/statistics/rates/ratesDaily.asp?fromdate=2011-6-3
Я так понимаю, возможно это всё из-за полной чехарды с курсом у нас в тот год. Потому как за 2012 и 2013 все верно конвертирует можно сказать, хотя для примера в 2013 курс тоже уплыл с 8600 до 9500 за доллар.
|
|
|
Admin
|
25 января 2014 12:43
|
medved Пишет: Цифра с сайта нац банка РБ. И где же правда?
Может на самом деле давали 4014 за USD, а нац. банк пытался всем сказать, что 4981? :)
|
|
|
medved
|
25 января 2014 12:53
|
Admin Пишет: medved Пишет:Цифра с сайта нац банка РБ.И где же правда? Может на самом деле давали 4014 за USD, а нац. банк пытался всем сказать, что 4981? :) Правда в том, что по 4981 нигде купить нельзя было. А на черном рынке было по 8-10 тыс. не помню точно.
А вот вторая дата, которую я привел, 04.11.2011. Курс нац банка стал уже 8650. И тогда уже валюта появилась в свободной продаже.
Поэтому курс на openexchangerates.org за 2011 год точно не соответствует никакой действительности.
|
|
|
Admin
|
25 января 2014 13:01
|
medved Пишет: Поэтому курс на openexchangerates.org за 2011 год точно не соответствует никакой действительности. Да, проблема.
Вот вам и история курсов. Увы, лучшего источника данных чем openexchangerates мы не нашли.
|
|
|
medved
|
25 января 2014 16:39
|
Admin Пишет: medved Пишет:Поэтому курс на openexchangerates.org за 2011 год точно не соответствует никакой действительности.Да, проблема. Вот вам и история курсов. Увы, лучшего источника данных чем openexchangerates мы не нашли. Ладно. Что поделать. Это все равно лучше, чем то, как было раньше, когда вообще курс в 3 раза отличался. 2011 год все равно был проблемным в плане курсов официальных и реальных. А по другим годам всё стало работать корректно.
Ещё раз огромное спасибо за решение этой проблемы! Я как и обещал, купил премиум подписку и дальше буду с удовольствием пользоваться вашим сервисом.
|
|
|
Ilyan
|
26 января 2014 14:39
|
Спасибо за историю!
И за ILS :)
Правда, есть появился косяк в отчетах: суммы в отчете по категориям неверные.
А при раскрытии детализации, итоги внизу списка - верные.
|
|
|
Ilyan
|
26 января 2014 14:40
|
* раз уж теперь можно добавить практически любую валюту, добавьте, пожалуйста, EGP (египетский фунт)
|
|
|
Admin
|
26 января 2014 18:13
|
Ilyan Пишет: суммы в отчете по категориям неверные. Здравствуйте,
Опишите подробнее проблему, по шагам и если можно покажите скриншот, где видно проблему.
|
|
|
Ilyan
|
26 января 2014 20:51
|
Мне кажется, что проблема с валютами без кода:
Вот 3-in-1 скриншот:
1. Oтчет по категориям с ошибкой
2. Детальный отчет по тем же тратам, где видны валюты
3. Настройки валюты "₪ FP" (валюта "₪" - по умолчанию)
|
|
|
Ilyan
|
26 января 2014 20:51
|
https://drive.google.com/file/d/0By50NczJWxY2YXFhMHZfeUdWTVU/edit?usp=sharing
|
|
|
Admin
|
26 января 2014 21:16
|
Ilyan Пишет: Мне кажется, что проблема с валютами без кода Да, вы указали "Учитывать историю курсов", но отчёт включает в себя операции в валюте, для которой нет истории курсов. Поэтому они "выкидываются" из отчёта.
Это всё ограничения текущей реализации истории курсов, дополнили описание в подсказке к полю "Валюта", в параметрах отчёта. Посмотрите.
|
|
|
Ilyan
|
26 января 2014 21:57
|
Admin Пишет: дополнили описание в подсказке Дополнили описание?!
Вы так говорите, как будто даже не собираетесь с ничего делать с этой проблемой.
И меня до 40% трат делается в валютах без истории - как теперь отчетами пользоваться?
А у других может "выкидывается" всего 1-5% трат и они этого даже не замечают...
|
|
|
Admin
|
26 января 2014 22:10
|
Ilyan Пишет: как теперь отчетами пользоваться Просто убрать галочку "Учитывать историю курсов".
|
|
|