Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выбрать данные с группировкой по неделям. / 10 сообщений из 10, страница 1 из 1
07.08.2009, 16:33:01
    #36132761
progi2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать данные с группировкой по неделям.
У меня задача показать пользователю статистику прибыли сгруппированную по неделям (последние 7 недель например).
Есть такая таблица

profit
id | user_id | date | profit
1 1 2009-06-01 100.55
2 1 2009-06-03 110.55
3 1 2009-06-04 120.55
4 1 2009-06-07 140.55
...
5 1 2009-06-12 130.55
6 1 2009-06-13 150.55
7 1 2009-06-14 105.55

В итоге должны получить что то типа 2009-06-01 по 2009-06-07 472$
Еще заморочка в том, что надо все делать относительно дней недели т.е. считать начиная с воскресенья за неделю (в примере выше 2009-06-01 - воскресенье), диапазон дат мне надо выводить.

Заранее спасибо!
...
Рейтинг: 0 / 0
07.08.2009, 16:56:08
    #36132809
progi2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать данные с группировкой по неделям.
Подробнее про то, какой результат хочу получить
На данный момент при группировки по дате у меня получаются такие данные

2009-08-08 150.0000
2009-08-07 100.0000
2009-06-18 1127.1973
2009-06-17 761.8159
2009-06-16 1061.7598
2009-06-15 1396.4341
2009-06-14 7452.1342
2009-06-13 629.0677
2009-06-12 466.9909
2009-06-11 1336.4949
2009-06-10 1770.0211
2009-06-07 4202.5746
2009-06-01 10509.7444

За пример возьмем дату 2009-06-01. Если посмотреть календарь то день недели среда. На выходе я должен пользователю отобразить

2009-06-01 до 2009-06-05 | 10509.7444
2009-06-05 до 2009-06-12 | 4202.5746 + 1770.0211 + 1336.4949 + 466.9909

Вот как то так
...
Рейтинг: 0 / 0
07.08.2009, 17:54:16
    #36132954
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать данные с группировкой по неделям.
progi2007,

Group By Week(mytable.date), нет?
...
Рейтинг: 0 / 0
07.08.2009, 18:16:25
    #36132988
progi2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать данные с группировкой по неделям.
tanglirprogi2007,

Group By Week(mytable.date), нет?

Да пробовал но результат вроде не тот..

Написал запрос

SELECT
DAYOFWEEK( d_date ) ,
iF( DAYOFWEEK( d_date ) =1, ADDDATE( d_date, INTERVAL 1 DAY ) , d_date ) AS startInt,
ADDDATE( d_date, INTERVAL( 7 - DAYOFWEEK( d_date ) +1 ) DAY ) AS endInt,
SUM( profit )
FROM `stat_profit`
GROUP BY d_date
ORDER BY d_date DESC

Получил почти нужный мне результат

DAYOFWEEK(d_date) startInt endInt SUM(profit)
7 2009-08-08 2009-08-09 150.0000
6 2009-08-07 2009-08-09 100.0000
5 2009-06-18 2009-06-21 1063.5653
4 2009-06-17 2009-06-21 761.8159
3 2009-06-16 2009-06-21 1061.7598
2 2009-06-15 2009-06-21 1396.4341
1 2009-06-15 2009-06-21 7452.1342
7 2009-06-13 2009-06-14 629.0677
6 2009-06-12 2009-06-14 466.9909
5 2009-06-11 2009-06-14 1336.4949
4 2009-06-10 2009-06-14 1770.0211
1 2009-06-08 2009-06-14 4202.5746
2 2009-06-01 2009-06-07 10509.7444

Теперь надо как то сгрупировать по интервалам т.е. 2009-06-13, 2009-06-12, 2009-06-11, 2009-06-10 попадает в интервал 2009-06-08 2009-06-14 шаманю-шаманю но толка пока нет

Если сделать группировку Group By Week(mytable.date)

Получаю такой результат

DAYOFWEEK(d_date) startInt endInt SUM(profit)
6 2009-08-07 2009-08-09 250.0000
3 2009-06-16 2009-06-21 11735.7093
4 2009-06-10 2009-06-14 8405.1491
2 2009-06-01 2009-06-07 10509.7444

Вроде и верно, я тоже хочу 4 недели получить, но периоды не такие какие мне надо.
...
Рейтинг: 0 / 0
07.08.2009, 18:44:01
    #36133049
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать данные с группировкой по неделям.
progi2007,

не dayofweek, а просто week. По первому примеру
Код: plaintext
1.
2.
3.
4.
5.
6.
1 1 2009-06-01 100.55
2 1 2009-06-03 110.55
3 1 2009-06-04 120.55
4 1 2009-06-07 140.55
5 1 2009-06-12 130.55
6 1 2009-06-13 150.55
7 1 2009-06-14 105.55
получилось так
Код: plaintext
1.
2.
3.
4.
5.
select week(date, 0 ) as nedelya
 ,date_sub(date, interval (dayofweek(date)- 1 ) day) as dbeg
 ,date_add(date, interval ( 7 -dayofweek(date)) day) as dend
 ,sum(profit) as sumprf
 from profit
 group by week(date)
Результат
Код: plaintext
1.
2.
|      22 | 2009-05-31 | 2009-06-06 | 331.650009155273 |
|      23 | 2009-06-07 | 2009-06-13 | 421.650009155273 |
|      24 | 2009-06-14 | 2009-06-20| 105.550003051758 |
Это - то, чего хотелось, или нет (на "хвосты" внимания не обращайте, почему-то сделал профит как флоат)?
...
Рейтинг: 0 / 0
07.08.2009, 19:03:50
    #36133082
progi2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать данные с группировкой по неделям.
tanglirprogi2007,

не dayofweek, а просто week. По первому примеру
Код: plaintext
1.
2.
3.
4.
5.
6.
1 1 2009-06-01 100.55
2 1 2009-06-03 110.55
3 1 2009-06-04 120.55
4 1 2009-06-07 140.55
5 1 2009-06-12 130.55
6 1 2009-06-13 150.55
7 1 2009-06-14 105.55
получилось так
Код: plaintext
1.
2.
3.
4.
5.
select week(date, 0 ) as nedelya
 ,date_sub(date, interval (dayofweek(date)- 1 ) day) as dbeg
 ,date_add(date, interval ( 7 -dayofweek(date)) day) as dend
 ,sum(profit) as sumprf
 from profit
 group by week(date)
Результат
Код: plaintext
1.
2.
|      22 | 2009-05-31 | 2009-06-06 | 331.650009155273 |
|      23 | 2009-06-07 | 2009-06-13 | 421.650009155273 |
|      24 | 2009-06-14 | 2009-06-20| 105.550003051758 |
Это - то, чего хотелось, или нет (на "хвосты" внимания не обращайте, почему-то сделал профит как флоат)?

Спасибо Вам за помощь, вроде где то близко но есть неточности... Вот мой результат

nedelya dbeg dend sumprf
31 2009-08-02 2009-08-08 250.0000
24 2009-06-14 2009-06-20 11799.3413
23 2009-06-07 2009-06-13 8405.1491
22 2009-05-31 2009-06-06 10509.7444

Отсортировал я их по dbeg DESC
22 2009-05-31 2009-06-06 10509.7444

Куда то пошли в обратную сторону, мне нужно получить неделю от текущего числа т.е. должно быть
2009-06-01 2009-06-07
дальше 23 2009-06-07 2009-06-13 8405.1491 должна привратится в
23 2009-06-08 2009-06-14 8405.1491
т.е. начинаем с понедельника так как закончили на воскресенье.
24 2009-06-14 2009-06-20 11799.3413 - эта привращается в
2009-06-15 2009-06-21 7452.1342
а последняя строка должна превратиться в
2009-08-07 2009-08-09

P.S я начал с конца анализ.
Суммы все совпадают а вот интервалы нет.
Буду благодарен если поможете добить скрипт. Мне редко приходится писать, что то сложное.
...
Рейтинг: 0 / 0
07.08.2009, 20:20:01
    #36133169
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать данные с группировкой по неделям.
progi2007,
Во-первых, в моём предыдущем варианте были и иные косяки (которые заметил я уже сам ). В-остальных...
У Вас было
В итоге должны получить что то типа 2009-06-01 по 2009-06-07 472$ <...> т.е. считать начиная с воскресенья за неделю (в примере выше 2009-06-01 - воскресенье)Я понял, что надо начинать считать с воскресенья, а выходит, что с понедельника? Вы всё-таки определитесь, откуда недели считать, потому что если с понедельника, то по первому примеру выходит 2 недели, а если с воскресенья - то 3. А если ещё и тут прочитать, то вообще засада - там вообще о пятнице речь идёт, причём она входит в оба интервала:
2009-06-01 до 2009-06-05 | 10509.7444
2009-06-05 до 2009-06-12 | 4202.5746 + 1770.0211 + 1336.4949 + 466.9909
Ещё
а последняя строка должна превратиться в
2009-08-07 2009-08-09 Если dbeg desc, то это будет первая строка. И кроме "превращения" в 2009-08-03 | 2009-08-09 ничего не придумывается.
PS. Если всё же понедельник (обратите внимание на цифирь 1 в функции week):
Код: plaintext
1.
2.
3.
4.
5.
6.
select week(date, 1 ) as nedelya
 ,date_sub(date, interval (weekday(date)) day) as dbeg
 ,date_add(date, interval ( 6 -weekday(date)) day) as dend
 ,sum(profit) as sumprf
 from profit
 group by week(date, 1 )
 order by dbeg desc
...
Рейтинг: 0 / 0
10.08.2009, 11:04:12
    #36134473
progi2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать данные с группировкой по неделям.
tanglirprogi2007,
Во-первых, в моём предыдущем варианте были и иные косяки (которые заметил я уже сам ). В-остальных...
У Вас было
В итоге должны получить что то типа 2009-06-01 по 2009-06-07 472$ <...> т.е. считать начиная с воскресенья за неделю (в примере выше 2009-06-01 - воскресенье)Я понял, что надо начинать считать с воскресенья, а выходит, что с понедельника? Вы всё-таки определитесь, откуда недели считать, потому что если с понедельника, то по первому примеру выходит 2 недели, а если с воскресенья - то 3. А если ещё и тут прочитать, то вообще засада - там вообще о пятнице речь идёт, причём она входит в оба интервала:
2009-06-01 до 2009-06-05 | 10509.7444
2009-06-05 до 2009-06-12 | 4202.5746 + 1770.0211 + 1336.4949 + 466.9909
Ещё
а последняя строка должна превратиться в
2009-08-07 2009-08-09 Если dbeg desc, то это будет первая строка. И кроме "превращения" в 2009-08-03 | 2009-08-09 ничего не придумывается.
PS. Если всё же понедельник (обратите внимание на цифирь 1 в функции week):
Код: plaintext
1.
2.
3.
4.
5.
6.
select week(date, 1 ) as nedelya
 ,date_sub(date, interval (weekday(date)) day) as dbeg
 ,date_add(date, interval ( 6 -weekday(date)) day) as dend
 ,sum(profit) as sumprf
 from profit
 group by week(date, 1 )
 order by dbeg desc


Спасибо Вам большое за помощь. Запрос отработал верно и вернул правильный вариант.
...
Рейтинг: 0 / 0
10.08.2009, 11:08:01
    #36134483
progi2007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать данные с группировкой по неделям.
авторЯ понял, что надо начинать считать с воскресенья, а выходит, что с понедельника? Вы всё-таки определитесь, откуда недели считать, потому что если с понедельника, то по первому примеру выходит 2 недели, а если с воскресенья - то 3. А если ещё и тут прочитать, то вообще засада - там вообще о пятнице речь идёт, причём она входит в оба интервала:


Ну как бы с понедельника по воскресенье, меня самого немного ввели в заблуждение так как таблица не моя. С интервалом я действительно намудрил, меня потом поправили (в примерах того Ю,что получалось у меня я это исправил)

Еще раз спасибо за помощь и терпение :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
11.06.2015, 09:57:38
    #38981870
Martinroot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбрать данные с группировкой по неделям.
Спасибо progi2007
progi2007Написал запрос

SELECT
DAYOFWEEK( d_date ) ,
iF( DAYOFWEEK( d_date ) =1, ADDDATE( d_date, INTERVAL 1 DAY ) , d_date ) AS startInt,
ADDDATE( d_date, INTERVAL( 7 - DAYOFWEEK( d_date ) +1 ) DAY ) AS endInt,
SUM( profit )
FROM `stat_profit`
GROUP BY d_date
ORDER BY d_date DESC

То, что мне нужно)
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выбрать данные с группировкой по неделям. / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]