![]() |
Помогите построить (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. |
Пока родил лишь такое: SELECT `date`, `name`, GROUP_CONCAT(DISTINCT `id` ORDER BY `date` ASC SEPARATOR ', ' ) AS 'vals' FROM `table` GROUP BY `date` limit 30; Это даст мне выдачу, где в строках будут дата, каждое имя и перечислены никальные id записей, которые можно посчитать, данные относительно легко разбросать по массивам. Но все же хотелось бы из БД получать готовую выборку. |
Сначала выбери все имена одним запросом, а потом строй второй запрос со всеми колонками. |
SELECT distinct таб.Имя FROM таб; |
SELECT таб.День, Sum(IIf([Имя]="петя",1,0)) AS петя, Sum(IIf([Имя]="вася",1,0)) AS вася, Sum(IIf([Имя]="коля",1,0)) AS коля FROM таб GROUP BY таб.День; |
в аксессе состряпал |
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; |
[url]http://sqlfiddle.com/#!2/2cc5d/3[/url] |
7-40KHYTbIU > GODLIKE!!! Большое спасибо за помощь! Доброго здоровья вам и вашим близким! |
Ну, или мой вариант на этом языке: 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. |