Webage
Новичок
Добрый вечер уважаемые пользователи. Столкнулся я с проблемой, для меня она на данный момент сложна и решение я найти не смог, вернее смог, но оно очень кривое. Итак суть проблемы. Не так давно я начал писать систему аналитики продаж. Задача над которой я сейчас бьюсь в следующем. Имеется база данных в MySQL, в ней таблица в которой находиться данные по продажам с 2013 по текущий год, порядка 70 тыс. записей. Структура таблицы следующая:
`sales` (
`product_number` text NOT NULL,
`product_name` text NOT NULL,
`sale_date` text NOT NULL,
`sale_date_ut` int(11) NOT NULL,
`manager` text NOT NULL,
`company_name` text NOT NULL,
`quantity_goods` int(11) NOT NULL,
`cost_sales` int(11) NOT NULL,
`transaction_number` int(11) NOT NULL,
`cost_goods` int(11) NOT NULL,
`inn` int(11) NOT NULL,
`kpp` int(11) NOT NULL,
`company_identifier` text NOT NULL,
`empty` int(11) NOT NULL
)
Где:
product_number - артикул товара
sale_date_ut - дата продажи в unix time
quantity_goods - количество проданного товара.
Необходимо выяснить следующее, какая продукция хуже продается в текущем периоде по сравнению с предыдущем годом. Интервал времени и процент роста продаж передается из формы. Соответственно те товары у которых процент роста ниже значения из формы выводятся в таблицу. Что я делаю сейчас.
Разбираю время:
Нахожу только уникальные артикулы товара за текущий период и за тот же период предыдущего года и заношу все это в массив:
Готовлю массив для разбора:
Далее запрашиваю информацию по каждому элементу массива и тут главный затык, если делать как сейчас, при выборе интервала в несколько месяцев скрипт обрабатывает запрос около 3-х минут, я так понимаю, что все запросы можно объединить в один и скорость выполнения будет выше.
Есть ли возможность объединить два запроса и сразу на стороне MySQL считать прирост и если прирост ниже условия заданного в форме выводить его в таблицу?
`sales` (
`product_number` text NOT NULL,
`product_name` text NOT NULL,
`sale_date` text NOT NULL,
`sale_date_ut` int(11) NOT NULL,
`manager` text NOT NULL,
`company_name` text NOT NULL,
`quantity_goods` int(11) NOT NULL,
`cost_sales` int(11) NOT NULL,
`transaction_number` int(11) NOT NULL,
`cost_goods` int(11) NOT NULL,
`inn` int(11) NOT NULL,
`kpp` int(11) NOT NULL,
`company_identifier` text NOT NULL,
`empty` int(11) NOT NULL
)
Где:
product_number - артикул товара
sale_date_ut - дата продажи в unix time
quantity_goods - количество проданного товара.
Необходимо выяснить следующее, какая продукция хуже продается в текущем периоде по сравнению с предыдущем годом. Интервал времени и процент роста продаж передается из формы. Соответственно те товары у которых процент роста ниже значения из формы выводятся в таблицу. Что я делаю сейчас.
HTML:
<form class="navbar-form navbar-right" method="post" role="form">
<input name="change_sales_form" type="hidden" value="send">
<div class="form-group input-group col-xs-2">
<input type="text" name="change_sales" placeholder="" class="form-control" value="'.$_POST['change_sales'].'">
<span class="input-group-addon">%</span>
</div>
<div class="form-group">
<input type="text" id="from" name="from" placeholder="от" class="form-control" value="'.$_POST['from'].'">
</div>
<div class="form-group">
<input type="text" id="to" placeholder="до" name="to" class="form-control" value="'.$_POST['to'].'">
</div>
<button type="submit" class="btn btn-success">Смотреть</button>
</form>
PHP:
$date_from_form = explode("-", $_POST['from']);
$date_to_form = explode("-", $_POST['to']);
$date_from_unix_now=mktime(0, 0, 0, $date_from_form[1], $date_from_form[0], $date_from_form[2]);
$date_to_unix_now=mktime(23, 59, 0, $date_to_form[1], $date_to_form[0], $date_to_form[2]);
$year_last=$date_from_form[2]-1;
$date_from_unix_last=mktime(0, 0, 0, $date_from_form[1], $date_from_form[0], $year_last);
$date_to_unix_last=mktime(23, 59, 0, $date_to_form[1], $date_to_form[0], $year_last);
PHP:
$get_distinct_items_now = $conn->Execute("SELECT DISTINCT product_number FROM `sales` WHERE product_number REGEXP '^[0-9]+$' AND `sale_date_ut`>=\"".$date_from_unix_now."\" AND `sale_date_ut`<=\"".$date_to_unix_now."\"");
if ($get_distinct_items_now && $get_distinct_items_now->RecordCount() > 0) {
while (!$get_distinct_items_now->EOF) {
$items_array[]=$get_distinct_items_now->fields['product_number'];
$get_distinct_items_now->MoveNext();
}
}
$get_distinct_items_last = $conn->Execute("SELECT DISTINCT product_number FROM `sales` WHERE product_number REGEXP '^[0-9]+$' AND `sale_date_ut`>=\"".$date_from_unix_last."\" AND `sale_date_ut`<=\"".$date_to_unix_last."\"");
if ($get_distinct_items_last && $get_distinct_items_last->RecordCount() > 0) {
while (!$get_distinct_items_last->EOF) {
$items_array[]=$get_distinct_items_last->fields['product_number'];
$get_distinct_items_last->MoveNext();
}
}
PHP:
$items_array=array_unique($items_array);
PHP:
foreach ($items_array as $value) {
$get_item_summ_now=$conn->Execute("SELECT product_number, product_name, SUM(quantity_goods) AS sum_quantity_goods FROM `sales` WHERE `product_number`=\"".$value."\" AND `sale_date_ut`>=\"".$date_from_unix_now."\" AND `sale_date_ut`<=\"".$date_to_unix_now."\"");
$get_item_summ_last=$conn->Execute("SELECT product_number, product_name, SUM(quantity_goods) AS sum_quantity_goods FROM `sales` WHERE `product_number`=\"".$value."\" AND `sale_date_ut`>=\"".$date_from_unix_last."\" AND `sale_date_ut`<=\"".$date_to_unix_last."\"");
$prirost_percent=(($get_item_summ_now->fields['sum_quantity_goods']/$get_item_summ_last->fields['sum_quantity_goods'])-*100)-100;
$prirost_percent=round($prirost_percent, 0);
if ($prirost_percent<$_POST['change_sales']) {
$items_list.='<tr>
<td>'.$value.'</td>
<td>'.$get_item_summ_last->fields['sum_quantity_goods'].'</td>
<td>'.$get_item_summ_now->fields['sum_quantity_goods'].'</td>
<td>'.$prirost_percent.'</td>
</tr>';
}
}
Последнее редактирование модератором: