Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка строк с группировкой по дате / 25 сообщений из 25, страница 1 из 1
03.12.2014, 17:22:32
    #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
03.12.2014, 17:39:12
    #38823978
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Сгруппируйте помесячно-поюзерно и получите суммы в подзапросах, и уже их связывайте.

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

да full join не поддерживает, а с представлениями никогда не работал, сейчас читаю, пытаюсь понять. Не подскажите как сделать?
...
Рейтинг: 0 / 0
03.12.2014, 18:51:35
    #38824061
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
...
Рейтинг: 0 / 0
03.12.2014, 19:06:48
    #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
03.12.2014, 19:58:23
    #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
03.12.2014, 20:55:08
    #38824161
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Прочитайте ещё раз мой совет. Но 1) весь 2) внимательно.
...
Рейтинг: 0 / 0
03.12.2014, 21:06:37
    #38824170
Евгений1000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Я правильно понимаю, создать две вьюхи, по сгруппированным данным каждой из таблиц, а потом делать запрос объединением вьюх?
...
Рейтинг: 0 / 0
03.12.2014, 21:10:38
    #38824174
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Вот! А Вы тем не менее всё опять в один запрос.

Да, рассмотрите ещё вот какой подход. В подзапросе получите все пары юзер-дата из обеих таблиц суммарно. И к тому, что получится, привязывайте исходные таблицы. В этом случае полного связывания не нужно.
...
Рейтинг: 0 / 0
03.12.2014, 21:31:54
    #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
03.12.2014, 21:35:22
    #38824187
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Класс! Вы умудрились реализовать третий вариант, промежуточный между двумя мной предложенными. Только конечный запрос - по первому варианту, что неразумно.
замените NULL на нули, и сделайте источником конечного запроса UNION ваших вьювов. А лефт джойны и дополнительные копии таблиц уже и не нужны.
...
Рейтинг: 0 / 0
03.12.2014, 22:09:40
    #38824214
Евгений1000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Блин, а других вариантов нет вообще? Ну эти вьюхи группируются по месяцам, а если нужно по дням или за 3 месяца стату((((
...
Рейтинг: 0 / 0
04.12.2014, 04:44:31
    #38824390
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Евгений1000Блин, а других вариантов нет вообще? Ну эти вьюхи группируются по месяцам, а если нужно по дням или за 3 месяца стату((((

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

Кстати, вот неплохой бесплатный индивидуальный продукт:
http://www.microstrategy.com/us/free/desktop
...
Рейтинг: 0 / 0
04.12.2014, 05:14:10
    #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
04.12.2014, 05:41:27
    #38824400
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Евгений1000javajdbcпропущено...


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

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


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

Но если вы спрашиваете:
автора если нужно по дням или за 3 месяца стату((((
то без фургона вы конечно же сможете таскать на велике,
но в какой-то момент заколебётесь.
...
Рейтинг: 0 / 0
04.12.2014, 06:16:28
    #38824406
Евгений1000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
javajdbcто без фургона вы конечно же сможете таскать на велике,
но в какой-то момент заколебётесь.
Ни в коем случае не хочу вас обидеть, но все же считаю, что для начала нужно хорошо выучить SQL, чем активно и занимаюсь.
В принципе, тред был "помогите найти решение текущей задачи", а не дайте совет, что мне поучить чтобы решать подобные задачи. Я конечно же могу отложить проект, забить на текущую проблему, начать изучать предложенные вами продукты, а там, через месяцок-другой, смотришь и необходимость в решении текущей проблемы вообще отпадет))
Пы.Сы. В принципе задача у меня уже имеет решение, причем 2-мя способами. Просто считаю решение пока не самое оптимальное.
Пы.Пы.Сы. За совет, отдельное спасибо! Интересно будет поковырять в свободное время.
...
Рейтинг: 0 / 0
04.12.2014, 13:47:18
    #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
05.12.2014, 23:28:21
    #38826754
Евгений1000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Спасибо за советы. Пока решил по последнему варианту, но на будущее советы учту
...
Рейтинг: 0 / 0
28.12.2014, 18:53:42
    #38844941
Евгений1000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Количество данных растет. Сложные запросы становятся накладными. Ребят, вот появилась мысль, а если создать событие, которое будет брать данные из таблиц и добавлять их в отдельную сводную, чтоб юзер уже напрямую тянул данные из готовой таблицы. Черт с ним, то что данные будут "запаздывать" на несколько минут - это не критично. Или это бред, который просто создаст лишнюю нагрузку?
С одной стороны, для создания сводной таблицы, ее данные будут обновляться пусть раз в 10 минут, с другой - пользователь смотрит данные в среднем 3 раза в сутки, создавая нагрузку на базу.
...
Рейтинг: 0 / 0
28.12.2014, 19:13:11
    #38844951
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Евгений1000а если создать событие, которое будет брать данные из таблиц и добавлять их в отдельную сводную, чтоб юзер уже напрямую тянул данные из готовой таблицы. Черт с ним, то что данные будут "запаздывать" на несколько минут - это не критично. Или это бред, который просто создаст лишнюю нагрузку?предагрегация - не бред, а здравая мысль, к которой рано или поздно приходят все :)
...
Рейтинг: 0 / 0
28.12.2014, 23:17:57
    #38845060
Евгений1000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
tanglir, т.е. именно таким способом который я описал?
Я так понял, что вы уже делали подобную работу. А не сравнивали эффективность, если писать в сводную таблицу сразу? Пытаюсь время свое сэкономить)))
...
Рейтинг: 0 / 0
29.12.2014, 06:33:06
    #38845146
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
Евгений1000А не сравнивали эффективность, если писать в сводную таблицу сразу?"Сразу", то есть не по расписанию, а триггером по изменению данных в исходной таблице? Смотрите сами - если нагрузка на диск сильно не возрастёт, то почему бы и нет...
...
Рейтинг: 0 / 0
29.12.2014, 11:17:03
    #38845316
Евгений1000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка строк с группировкой по дате
tanglir, пока у меня не очень большая нагрузка в среднем до 10 записей в минуту (с проверкой на уникальность). Но она постоянно растет - текущая с 0 на начало месяца))

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


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