powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка строк с группировкой по дате
25 сообщений из 25, страница 1 из 1
Выборка строк с группировкой по дате
    #38823951
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, помогите решить задачу, пожалуйста

Дано две таблицы

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE IF NOT EXISTS `tbl_results` (
`id` int(10) unsigned NOT NULL,
  `results_date` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `comission` float NOT NULL,
) 

INSERT INTO `tbl_results` (`id`, `results_date`, `user_id`, `comission`) VALUES
(1, 1417546758, 70, 16,),
(2, 1417547530, 70, 16,),
(3, 1417547577, 71, 15),

CREATE TABLE IF NOT EXISTS `tbl_payment` (
`id` int(11) unsigned NOT NULL,
  `user_id` int(11) NOT NULL,
  `date_payment` int(11) NOT NULL,
  `summa` float NOT NULL,
)

INSERT INTO `tbl_payment` (`id`, `user_id`, `date_payment`, `summa`) VALUES
(1, 70, 1417612651, 50),
(2, 70, 1416748651, 50), //это ноябрь, остальные декабрь
(3, 70, 1417612651, 50);



Нужно вывести статистику, а конкретно должно получиться
id | Дата | Комиссия | Выплата
70 | November,2014 | 0 | 50
70 | December,2014 | 32 | 100
71 | December,2014 | 15 | 0

Чет у меня ничего не получается((( Вот что пробовал:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
	SELECT `t`.`user_id` AS `id`, 
	DATE_FORMAT(FROM_UNIXTIME(results_date),"%M,%Y ") as dates, 
	sum(comission) as sumComission, 
	sum(payment.summa) as sumPayments 
	FROM `tbl_results` `t` 
	LEFT JOIN `tbl_payment` `payment` ON (DATE_FORMAT(FROM_UNIXTIME(t.results_date),"%M,%Y")=DATE_FORMAT(FROM_UNIXTIME(payment.date_payment),"%M,%Y") and (t.user_id=payment.user_id or payment.user_id is null)) 

	GROUP BY date_format(date_add(results_date, interval 1 month),"%m-%Y "),t.user_id 


Выводит почти то что нужно, но только sumPayments вообще непонятная для меня цифра получается и не выводит строки, если нет данных совпадающих по дате в таблице tbl_result
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38823978
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сгруппируйте помесячно-поюзерно и получите суммы в подзапросах, и уже их связывайте.

Поскольку нужен FULL OUTER JOIN, я бы рекомендовал использовать не подзапросы, а вьювы. Оптимизатор может и не понять, что два разных подзапроса на самом деле один подзапрос в двух экземплярах. Хотя попробуйте, если поймёт - оставьте подзапросами.
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824051
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

да full join не поддерживает, а с представлениями никогда не работал, сейчас читаю, пытаюсь понять. Не подскажите как сделать?
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824061
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824067
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ссылку то я нашел)) Не могу связать все равно таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	create view statistic as
	SELECT `t`.`partner_id` AS `t0_c2`, 
	DATE_FORMAT(FROM_UNIXTIME(t.results_date),"%M,%Y ") as dates, 
	sum(t.comission) as comission ,
	sum(payment.summa) as sum sumPayments
	FROM `tbl_results` `t` , `tbl_payment` `payment`
	where 

		DATE_FORMAT(FROM_UNIXTIME(t.results_date),"%M,%Y")=DATE_FORMAT(FROM_UNIXTIME(payment.date_payment),"%M,%Y")

GROUP BY date_format(date_add(FROM_UNIXTIME(t.results_date), interval 1 month),"%m-%Y "),t.partner_id 
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824107
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил вроде так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
	SELECT 
		`t`.`user_id` , 
		DATE_FORMAT(FROM_UNIXTIME(t.results_date),"%M,%Y ") as dates, 
		sum(t.comission) as comission ,
		paymentJoin.paySumm
	FROM `tbl_results` `t`
        LEFT JOIN (
		SELECT 
			user_id as userid,
			SUM(payment.summa) as paySumm,
			DATE_FORMAT(FROM_UNIXTIME(payment.date_payment),"%M,%Y ") as datePayment
		FROM `tbl_payment` `payment`
		GROUP BY date_format(date_add(FROM_UNIXTIME(payment.date_payment), interval 1 month),"%m-%Y "),payment.user_id 
	) paymentJoin ON (DATE_FORMAT(FROM_UNIXTIME(t.results_date),"%M,%Y ")=paymentJoin.datePayment and t.user_id=paymentJoin.userid)
	GROUP BY date_format(date_add(FROM_UNIXTIME(t.results_date), interval 1 month),"%m-%Y "),t.user_id 	
	union
	SELECT 
		`paymentJoin`.`userid` , 
		paymentJoin.datePayment, 
		sum(t.comission) as comission ,
		paymentJoin.paySumm
	FROM `tbl_results` `t`
        right JOIN (
		SELECT 
			user_id as userid,
			SUM(payment.summa) as paySumm,
			DATE_FORMAT(FROM_UNIXTIME(payment.date_payment),"%M,%Y ") as datePayment
		FROM `tbl_payment` `payment`
		GROUP BY date_format(date_add(FROM_UNIXTIME(payment.date_payment), interval 1 month),"%m-%Y "),payment.user_id 
	) paymentJoin ON (DATE_FORMAT(FROM_UNIXTIME(t.results_date),"%M,%Y ")=paymentJoin.datePayment and t.user_id=paymentJoin.userid)
	GROUP BY date_format(date_add(FROM_UNIXTIME(t.results_date), interval 1 month),"%m-%Y "),t.user_id



только вьюха не создается если добавить create view statistic as(((
Кажется мне что это не очень оптимальное решение и конечно вьюху нужно, чтоб фильтровать удобно было.
Ребят, подскажите, ПОЖАЛУЙСТА
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824161
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитайте ещё раз мой совет. Но 1) весь 2) внимательно.
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824170
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я правильно понимаю, создать две вьюхи, по сгруппированным данным каждой из таблиц, а потом делать запрос объединением вьюх?
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824174
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот! А Вы тем не менее всё опять в один запрос.

Да, рассмотрите ещё вот какой подход. В подзапросе получите все пары юзер-дата из обеих таблиц суммарно. И к тому, что получится, привязывайте исходные таблицы. В этом случае полного связывания не нужно.
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824182
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaВот! А Вы тем не менее всё опять в один запрос.

Да, рассмотрите ещё вот какой подход. В подзапросе получите все пары юзер-дата из обеих таблиц суммарно. И к тому, что получится, привязывайте исходные таблицы. В этом случае полного связывания не нужно.

да я пока еще и с вьюхами не переварил(((

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
create view r_statistic as (
SELECT 
	`t`.`user_id` as user_id, 
	DATE_FORMAT(FROM_UNIXTIME(t.results_date),"%M,%Y ") as dates, 
	sum(t.comission) as comission ,
	NULL as sumPayments
FROM `tbl_results` `t`
GROUP BY date_format(date_add(FROM_UNIXTIME(t.results_date), interval 1 month),"%m-%Y "),t.user_id 	
)

create view p_statistic as (
SELECT 
	`t`.`user_id` as user_id, 
	DATE_FORMAT(FROM_UNIXTIME(t.date_payment),"%M,%Y ") as dates, 
	NULL as comission ,
	sum(t.summa) as sumPayments
FROM `tbl_payment` `t`
GROUP BY date_format(date_add(FROM_UNIXTIME(t.date_payment), interval 1 month),"%m-%Y "),t.user_id 	
)

select r.user_id, r.dates, r.comission, p.sumPayments from r_statistic r
LEFT OUTER JOIN p_statistic p ON p.user_id=r.user_id and r.dates=p.dates
union
select p.user_id, p.dates, r.comission, p.sumPayments from r_statistic r
RIGHT OUTER JOIN p_statistic p ON p.user_id=r.user_id and r.dates=p.dates



Так? Или нет?
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824187
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Класс! Вы умудрились реализовать третий вариант, промежуточный между двумя мной предложенными. Только конечный запрос - по первому варианту, что неразумно.
замените NULL на нули, и сделайте источником конечного запроса UNION ваших вьювов. А лефт джойны и дополнительные копии таблиц уже и не нужны.
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824214
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, а других вариантов нет вообще? Ну эти вьюхи группируются по месяцам, а если нужно по дням или за 3 месяца стату((((
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824390
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений1000Блин, а других вариантов нет вообще? Ну эти вьюхи группируются по месяцам, а если нужно по дням или за 3 месяца стату((((

Учите data warehouse, datamart,
multidimensional storage, BI...
если что побесплатнее, то Pentaho, Mondrian,
ПоплАтнее : SSAS, Cognos...там и Оракле

Кстати, вот неплохой бесплатный индивидуальный продукт:
http://www.microstrategy.com/us/free/desktop
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824397
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcЕвгений1000Блин, а других вариантов нет вообще? Ну эти вьюхи группируются по месяцам, а если нужно по дням или за 3 месяца стату((((

Учите data warehouse, datamart,
multidimensional storage, BI...
если что побесплатнее, то Pentaho, Mondrian,
ПоплАтнее : SSAS, Cognos...там и Оракле

Кстати, вот неплохой бесплатный индивидуальный продукт:
http://www.microstrategy.com/us/free/desktop
чесно говоря не понял зачем. Мне нужно решить конкретную задачу в MySQL - получить данные из двух таблиц с группировкой
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824400
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений1000javajdbcпропущено...


Учите data warehouse, datamart,
multidimensional storage, BI...
если что побесплатнее, то Pentaho, Mondrian,
ПоплАтнее : SSAS, Cognos...там и Оракле

Кстати, вот неплохой бесплатный индивидуальный продукт:
http://www.microstrategy.com/us/free/desktop
чесно говоря не понял зачем. Мне нужно решить конкретную задачу в MySQL - получить данные из двух таблиц с группировкой


У вас есть велосипед и вы спрашиваете как
перевезти два яшика яблок -- ок, варианты подсказали --
поставить одни на другой, или там подшипники приделать
-- вы это сделаете.

Но если вы спрашиваете:
автора если нужно по дням или за 3 месяца стату((((
то без фургона вы конечно же сможете таскать на велике,
но в какой-то момент заколебётесь.
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824406
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcто без фургона вы конечно же сможете таскать на велике,
но в какой-то момент заколебётесь.
Ни в коем случае не хочу вас обидеть, но все же считаю, что для начала нужно хорошо выучить SQL, чем активно и занимаюсь.
В принципе, тред был "помогите найти решение текущей задачи", а не дайте совет, что мне поучить чтобы решать подобные задачи. Я конечно же могу отложить проект, забить на текущую проблему, начать изучать предложенные вами продукты, а там, через месяцок-другой, смотришь и необходимость в решении текущей проблемы вообще отпадет))
Пы.Сы. В принципе задача у меня уже имеет решение, причем 2-мя способами. Просто считаю решение пока не самое оптимальное.
Пы.Пы.Сы. За совет, отдельное спасибо! Интересно будет поковырять в свободное время.
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38824843
biwed.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений1000,
Добрый день. Можно скрипт написать по другому.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select user_id, 
       DATE_FORMAT(FROM_UNIXTIME(date_payment),"%M,%Y"), 
       sum(summa), 
       sum(comission)
from
  ( SELECT user_id, 
           date_payment, 
           summa, 
           0  as  comission
    FROM tbl_payment
union all
      SELECT user_id,
             results_date, 
             0, 
             comission
      FROM tbl_results
) as t
group by user_id, DATE_FORMAT(FROM_UNIXTIME(date_payment),"%M,%Y");


Если это на SQL делать.
javajdbc прав, что надо учить OLAP кубы и прочее. Много чего интересного можно сделать и узнать.

PS. Если делать такое на кубах, к примеру на Mondrian то урок www.biwed.ru/index.php/pentaho/50-praktika-obedinenija-virtual-cube . Реализуется через виртуальный куб.

C уважением,
biwed.ru
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38826754
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы. Пока решил по последнему варианту, но на будущее советы учту
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38844941
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Количество данных растет. Сложные запросы становятся накладными. Ребят, вот появилась мысль, а если создать событие, которое будет брать данные из таблиц и добавлять их в отдельную сводную, чтоб юзер уже напрямую тянул данные из готовой таблицы. Черт с ним, то что данные будут "запаздывать" на несколько минут - это не критично. Или это бред, который просто создаст лишнюю нагрузку?
С одной стороны, для создания сводной таблицы, ее данные будут обновляться пусть раз в 10 минут, с другой - пользователь смотрит данные в среднем 3 раза в сутки, создавая нагрузку на базу.
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38844951
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений1000а если создать событие, которое будет брать данные из таблиц и добавлять их в отдельную сводную, чтоб юзер уже напрямую тянул данные из готовой таблицы. Черт с ним, то что данные будут "запаздывать" на несколько минут - это не критично. Или это бред, который просто создаст лишнюю нагрузку?предагрегация - не бред, а здравая мысль, к которой рано или поздно приходят все :)
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38845060
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, т.е. именно таким способом который я описал?
Я так понял, что вы уже делали подобную работу. А не сравнивали эффективность, если писать в сводную таблицу сразу? Пытаюсь время свое сэкономить)))
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38845146
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений1000А не сравнивали эффективность, если писать в сводную таблицу сразу?"Сразу", то есть не по расписанию, а триггером по изменению данных в исходной таблице? Смотрите сами - если нагрузка на диск сильно не возрастёт, то почему бы и нет...
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38845316
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, пока у меня не очень большая нагрузка в среднем до 10 записей в минуту (с проверкой на уникальность). Но она постоянно растет - текущая с 0 на начало месяца))

Спасибо за ответы. Буду пробовать варианты.
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38845390
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений100010 записей в минутуНу если база крутится не на калькуляторе, то можете триггер ставить.
...
Рейтинг: 0 / 0
Выборка строк с группировкой по дате
    #38846132
Евгений1000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir, спасибо, буду пробовать.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка строк с группировкой по дате
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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