Генерация еженедельного отчета

an_kalinovski

Новичок
Генерация еженедельного отчета

Плиз помогите!!!!

Не могу сообразить как зарулить такую вещь:
есть таблица со списком заказов. Заказы делались в определенные дни с промежутками в недели и больше. Нужно вывести еженедельный (еже месячный и т.д.) отчет, причем в отчете должны быть указаны как существующие данные, так и "пустые" недели.

Сделал такого типа запрос -

$q1 = "SELECT ".$select_query."
sum(order_status = 'processed') as pro_orders,
FORMAT(sum(`total_amount`),2) as all_total_amount,
FROM order
WHERE o_date>'".$from."' AND o_date<'".$to."'"
.$group_query;

т.е. получаю нужные столбцы и группирую например по неделям. НО. Максимум что я имею - это номер YEARWEEK.

Пусть у меня данные за три недели.
Причем например входная дата отчета начинается с середины недели, во вторую неделю не было вообще заказов а в третью - снова были.

Я не прошу писать за меня код :))
Я прошу направить мои мысли. Я думал получать например YEARWEEK, а в отчет подставлять данные по датам уже средствами php, проверяя по ходу, если нет данных по неделе, следующей за неделей 200434, то плевать нолики в отчет... Но у меня не получилось... В мануале по Мускулу я не нашел функций типа первый последний день недели... В какую сторону рыть землю, а?

Всем заранее спасибо...
 

an_kalinovski

Новичок
Автор оригинала: alpine
an_kalinovski

А теперь дыши глубже ... расскажи про структуру таблицы, запрос без переменных пхп и что должно быть на выходе.
Стркутура примитивная достаточно-

------------------------------------------
| id | _date | status | price |
------------------------------------------
1 2003-12-25 new 10,35
------------------------------------------
2 2003-10-27 old 15,45
------------------------------------------
3 2004-01-07 old 45

...

$q1 = "SELECT YEARWEEK(_date)
sum(order_status = 'new') as new_orders,
FORMAT(sum(`price`),2) as all_total,
FROM order
WHERE date>'"2003-11-20"' AND o_date<'2004-02-20"
GROUP BY YEARWEEK(_date);

А на выходе:

------------------------------------------
| № | start_date | start_date | new_orders | all_total |
--------------------------------------------------------------------------------
1 | 2003-12-25 | 2003-12-28 | 1 | 25,80 |
-------------------------------------------------------------------------------
2 | 2003-12-29 | 2004-01-04 | 0 | 0 |
-------------------------------------------------------------------------------
3 | 2004-01-05 | 2004-01-04 | 0 | 45 |
-------------------------------------------------------------------------------


...
 

antson

Новичок
Партнер клуба
тебе потребуется вспомогательные таблички
для недельного отчета 0,1,2 .. 6
это дни недели делаешь лефт джоин по условию что
день недели равен полю вспомогательной таблицы
дополнительно в where задаешь диапазон дат

для недельного вспомогательная таблица 1-56
номера недель . лефт джоин по номеру недели
дополнительно в where задаешь диапазон дат
или интервал номеров недель.
 

an_kalinovski

Новичок
Автор оригинала: antson
тебе потребуется вспомогательные таблички
для недельного отчета 0,1,2 .. 6
это дни недели делаешь лефт джоин по условию что
день недели равен полю вспомогательной таблицы
дополнительно в where задаешь диапазон дат

для недельного вспомогательная таблица 1-56
номера недель . лефт джоин по номеру недели
дополнительно в where задаешь диапазон дат
или интервал номеров недель.
Ты имеешь ввиду временные таблицы или таблицы в базе?
 

Gas

может по одной?
Не нужно никаких дополнительных таблиц (если записей у тебя не миллионы). Что у тебя не получается? Выбрать данные в промежутке дат? Вывести эти данные в красивом виде? Есть функции работы с датами с помощью которых всё можно сделать [m]mktime[/m], [m]strtotime[/m], [m]date[/m] + http://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html
 

an_kalinovski

Новичок
Автор оригинала: Gas
Не нужно никаких дополнительных таблиц (если записей у тебя не миллионы). Что у тебя не получается? Выбрать данные в промежутке дат? Вывести эти данные в красивом виде? Есть функции работы с датами с помощью которых всё можно сделать [m]mktime[/m], [m]strtotime[/m], [m]date[/m] + http://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html
Спасибо, уважаемый GAS, кажись mktime то что нужно!!! Как то я пропустил эту функцию вчера в своих поисках по мануалам ... мне как раз нужно что-то типа
$lastday = mktime(0, 0, 0, 3, 0, 2000);

Viva experts!
 

antson

Новичок
Партнер клуба
Gas
-- Не нужно никаких дополнительных таблиц

В исходном посте было :
-- во вторую неделю не было вообще заказов
-- причем в отчете должны быть указаны как существующие данные, так и "пустые" недели.

И как функции работы со временем помогут сделать недостащие данные ??

Упростим пример
1.1.05 10
3.1.05 8
5.1.05 12

запрос должен сделать
дата колво
1.01.05 10
2.01.05 0
3.01.05 8
4.01.05 0
5.01.05 12
6.01.05 0
7.01.05 0



an_kalinovski
Как у вас с "пустыми" неделями.

Gas
Конечно эти функции пригодятся, когда из данных вспомогательных таблицы будут собираться
стартовая и конечная даты
 

Gas

может по одной?
antson
уверен что под отчётом понимается не sql выборка, а формирование удобоваримого результата из неё.

ну а твой пример с помошью php решается на ура одним sql запросом и простым циклом, ага.
 

alpine

Новичок
Как вариант.
1) Получаем массив из mysql в виде $array1 = array('неделя1' => 'какое-то значение', 'неделя4' => ... )
2) Формираем массив со всеми пустыми неделями $array2 = array('неделя1' => 'пустое значение', 'неделя2' => ...)
3) Мержим два исходных массива функцией $result_array = [m]array_merge[/m]($array2, $array1)
4) print_r($result_array).

-~{}~ 25.11.05 14:07:

+ учесть нюанс с ключами массивов, который описан в документации к array_merge()
 

antson

Новичок
Партнер клуба
Gas
ну цикл будет не совсем простым :)
цикл по запросу а внутри цикл для вставки
недостающих строк между текущей датой и датой на предыдущей итерации.
вариант alpine лучше будет в плане
читаемости но
1) созадть 1масив в цикле по запросу
2) создать 2массив
3) цикл вывода

как всегда способов сделать одно и тоже множество.
Как делать определяется тем что эффективнее и проше реализовать.
 

alpine

Новичок
antson
>> 1) созадть 1масив в цикле по запросу
запрос делаешь 1 раз с GROUP BY до цикла, а не в цикле по запросу. После приводишь результаты запроса к массиву в цикле.
 
Сверху