Форум на Kuban.ru (http://forums.kuban.ru/)
-   Веб-дизайн и программирование (http://forums.kuban.ru/f1030/)
-   -   Помогите построить (my)SQL-запрос для графика (http://forums.kuban.ru/f1030/pomogite_postroit-_my_sql-zapros_dlya_grafika-6083755.html)

Nikitz 11.09.2014 15:26

Помогите построить (my)SQL-запрос для графика
 
Есть вот такой набор данных (лог) с датами и именами:
[img]http://s019.radikal.ru/i605/1409/1d/f4cc432604a8.png[/img]

Нужно выбрать число записей с каждым именем за каждую дату c группировкой по дате, чтобы потом на основании этих данных построить графики.
[img]http://i008.radikal.ru/1409/68/4108a5c718ad.png[/img]

С одним именем проблемы нет, а как выбрать сразу всех — не пойму.

Данные будут преобразованы в JSON чтобы отдаваться в Google Charts API.

Nikitz 11.09.2014 16:25

Пока родил лишь такое:

SELECT
`date`,
`name`,
GROUP_CONCAT(DISTINCT `id` ORDER BY `date` ASC SEPARATOR ', ' ) AS 'vals'
FROM `table` GROUP BY `date` limit 30;

Это даст мне выдачу, где в строках будут дата, каждое имя и перечислены никальные id записей, которые можно посчитать, данные относительно легко разбросать по массивам.

Но все же хотелось бы из БД получать готовую выборку.

buh 14.09.2014 19:45

Сначала выбери все имена одним запросом, а потом строй второй запрос со всеми колонками.

buh 14.09.2014 20:29

SELECT distinct таб.Имя FROM таб;

buh 14.09.2014 20:29

SELECT таб.День, Sum(IIf([Имя]="петя",1,0)) AS петя, Sum(IIf([Имя]="вася",1,0)) AS вася, Sum(IIf([Имя]="коля",1,0)) AS коля
FROM таб
GROUP BY таб.День;

buh 14.09.2014 20:30

в аксессе состряпал

40KHYTbIU 14.09.2014 22:35

create table t1 (
Date date,
Name varchar(20)
);

insert into t1 values
( '2014-09-01', 'Vasy'),
( '2014-09-01', 'Pety'),
( '2014-09-01', 'Ivan'),
( '2014-09-01', 'Vasy'),
( '2014-10-01', 'Ivan'),
( '2014-10-01', 'Vasy');

SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'COUNT(IF(t.Name = ''',
Name,
''', t.Name, NULL)) AS ',
Name
)
) INTO @sql
FROM t1;

SET @sql = CONCAT('SELECT t.Date,', @sql, '
FROM t1 t
GROUP BY t.Date');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

40KHYTbIU 14.09.2014 22:36

[url]http://sqlfiddle.com/#!2/2cc5d/3[/url]

Nikitz 16.09.2014 12:18

7-40KHYTbIU > GODLIKE!!! Большое спасибо за помощь! Доброго здоровья вам и вашим близким!

buh 18.09.2014 00:28

Ну, или мой вариант на этом языке:

select group_concat('sum(if(Name = ''', Name, ''', 1, 0)) AS ', Name) from (select distinct Name from t1) as t2 into @sql;



SET @sql = CONCAT('SELECT t.Date,', @sql, '
FROM t1 t
GROUP BY t.Date');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;


Текущее время: 21:43. Часовой пояс GMT +3.