Вот искал я запрос, который бы смог мне построить выписку по всем изменениям абонентского счёта конкретного абонента за указанный период. Не нашёл, написал сам и решил поделиться.
Код: Выделить всё
/* Задаём параметры выборки, а именно период и логин абонента */
set @login="login";
set @start_date = UNIX_TIMESTAMP( '2010-09-01 00:00:00' );
set @end_date = UNIX_TIMESTAMP( '2011-05-01 00:00:00' );
/* Отдельно по логину извлекаем ID аккаунта */
set @account = ( select users.basic_account from users where users.login like @login );
/* Основная выборка данных */
select
FROM_UNIXTIME( discount_date ) as "Дата операции",
if( services_data.service_name is null, "Платёж", "Снятие" ) "Операция",
if( services_data.service_name is null, "", services_data.service_name ) "Основание",
ROUND( incoming_rest , 2 ) as "Счёт до операции",
ROUND( ( -1*discount ) , 2 ) as "Сумма операции",
ROUND( outgoing_rest , 2 ) as "Счёт после операции"
/* Используем таблицу денежных списаний (где почему то есть так же и начисления) */
from
discount_transactions_all
/* Подключаем сервисные связки что бы узнать за что списаны деньги */
left join services_data on services_data.id=discount_transactions_all.service_id
where
account_id=@account
and
/* Наткнулся на невероятное множество микросписаний, пришлось откидывать */
ROUND( discount , 2 ) <> 0
and
discount_date > @start_date
and
discount_date < @end_date
order by "Дата операции"
По вкусу так же можно прикручивать расчётные периоды и прочее. К сожалению такая выборка не позволяет узнать метод платежа. Их можно прикручивать отдельно, но это сильно усложнит структуру запроса, да и время запроса тоже сильно пострадает.