Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Выбор с группировкой по датам

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: под конец дня не соображу
Panoptik
Отправлено: 12 Октября, 2012 - 22:46:23
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




доброго вечера

есть задачка:
таблица stat:
id int
userId int
operationId int
price float
time datetime

в ней будут храниться данные примерно так рассматриваю наиболее важные поля
сразу упомяну что запрос будет выбирать только по определенному значению userId, так что это как константа может быть записана сразу в WHERE
дата хранится в соответствующем формате, но для наглядности запишу так

итак имеем набор данных
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. operationId price datetime
  3. 1  800 28.06.12
  4. 3 -130 28.06
  5. 2  -34 29.06
  6. 2 -34 30.06
  7. 2 -34 1.07
  8. 2 -34 2.07
  9. 2 -34 1.07
  10. 2 -34 2.07
  11. 2 -34 3.07
  12. 2 -34 4.07
  13. 2 -34 5.07
  14. 2 -34 6.07
  15. 2 -34 7.07
  16. 2 -38 8.07
  17. 2 -38 9.07
  18. 2 -38 10.07
  19. 2 -38 11.07
  20. 2 -38 12.07
  21. 1 200 12.07
  22. 2 -38 13.07
  23. 2 -38 13.07
  24.  


собственно таблица где записываются все операции изменения счета
задача состоит в том чтобы выбрать все данные в сводный отчет где все ежедневные значения (операция 2) должны сгрупироваться в единое значение за месяц, а остальный значения в хронологическом порядке должны выводиться как есть
то есть на выходе нужно получить примерно так
CODE (htmlphp):
скопировать код в буфер обмена
  1. дата сумма операция
  2. 28.06.12 +800 пополнение счета
  3. 28.06.12 -200 покупка услуги 1
  4. 1.07.12 -68 ежемесячная оплата
  5. 12.07 +200 пополнение счета
  6. 1.08 -750 ежемесячная оплата
  7.  


как бы лучше решить такую задачку?
если нужно по другому хранить данные. то это пока можно так как проект на стадии разработки


-----
Just do it
 
 Top
Okula
Отправлено: 13 Октября, 2012 - 00:18:45
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `table` WHERE `operationId`=2 AND MONTH(NOW())=MONTH(`datetime`)
 
 Top
Panoptik
Отправлено: 13 Октября, 2012 - 00:41:40
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




ну это так конечно, но мне нужно выбрать за весь период типа так:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT *, SUM(`price`) `s`, YEAR(`datetime`) `y`, MONTH(`datetime`) `m`  
  2. FROM stat
  3. GROUP BY `y`,`m`
  4. WHERE operationId = 2 AND userId = 1  

вот как то так должно быть, но к этому мне нужно еще выбрать другие операции как то
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM stat WHERE operationId <> 2 AND userId = 1


в голову приходит только идея объединять эти запросы юнионом или делать их в рознь и обрабатывать потом с помощью php

как быть?


-----
Just do it
 
 Top
Okula
Отправлено: 13 Октября, 2012 - 00:46:08
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




union
 
 Top
Panoptik
Отправлено: 13 Октября, 2012 - 00:49:38
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




ну спасибо. будем пробовать пока так


-----
Just do it
 
 Top
Panoptik
Отправлено: 13 Октября, 2012 - 13:29:20
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




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

во-первых юнион, который вроде как отправляет индексы в известное место
во-вторых сложные конструкции с датами. можно ли как нибудь это оптимизировать?

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT operationId  ,
  2.         SUM( `price` ) `sum` ,
  3.         STR_TO_DATE(
  4.                 CONCAT(
  5.                         YEAR( DATE( `time` ) + INTERVAL 1 MONTH ) ,
  6.                         "-",
  7.                         MONTH( DATE( `time` ) + INTERVAL 1 MONTH ) ,
  8.                         "-", 01
  9.                 ),
  10.         "%Y-%m-%d") `date`
  11.   FROM `payment_statistic`
  12.   WHERE userId =1
  13.     AND operationId =2
  14.     AND STR_TO_DATE( CONCAT( YEAR( DATE( `time` ) + INTERVAL 1
  15. MONTH ) , "-", MONTH( DATE( `time` ) + INTERVAL 1 MONTH),"-",01),"%Y-%m-%d") < NOW()
  16.   GROUP BY YEAR(`time`), MONTH(`time`)
  17. UNION
  18. SELECT operationId  
  19.         `price` `sum` ,
  20.         DATE(`time`) `date`
  21.   FROM `payment_statistic`
  22.   WHERE userId = 1
  23.     AND operationId <> 2
  24. ORDER BY `date`


для наглядности привожу результат
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. operationId sum date
  3. 1       800     2012-08-13
  4. 2       -220.64515686035156     2012-09-01
  5. 1       1200    2012-09-12
  6. 2       -321.2903251647949      2012-10-01
  7. 3       -120    2012-10-12
  8.  

(Отредактировано автором: 13 Октября, 2012 - 13:33:12)



-----
Just do it
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB