Здравствуйте, как создать сводную таблицу с запросами есть 3 таблицы: 1) bd (столбцы: otdel, name_comp) 2) comp (столбцы: name_comp) 3) otdel (столбцы: otdel) хотел бы такую таблицу создать с помощью запроса свод таблица | otdel1 | otdel2 | otdel3 | ------------------------------------------------------ name_comp1 |___2____|___4____|___0___| ------------------------------------------------------ name_comp2 |___0____|___1____|___6___| ------------------------------------------------------
Непростая (по крайней мере для меня) задача. Причем, многие решения, что есть в интернете используют заранее известное количество столбцов. Есть такой тип запросов PIVOT, но его реализации в MySQL толком нет. Если у меня чего получится, то обязательно отпишусь.
Обзор возможных вариантов есть тут. При неизвестном заранее кол-ве столбцов нужно использовать хранимую процедуру, которая посчитает кол-во столбцов, составит на основании того запрос и выполнит его.
Здравствуйте, Код (Text): -- Дамп структуры для таблица inver.otdel CREATE TABLE IF NOT EXISTS `otdel` ( `id` int(11) NOT NULL AUTO_INCREMENT, `address` int(11) DEFAULT NULL, `otdel` text, KEY `id` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; -- Дамп структуры для таблица inver.comp CREATE TABLE IF NOT EXISTS `comp` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name_comp` text, KEY `id` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=284 DEFAULT CHARSET=utf8; -- Дамп структуры для таблица inver.bd CREATE TABLE IF NOT EXISTS `bd` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name_comp` text NOT NULL, `otdel` text NOT NULL, KEY `id` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=336 DEFAULT CHARSET=utf8;
сделал только так, на таблицу bd, не вмешивая другие таблицы Код (Text): SELECT name_comp, COUNT(IF(otdel='otdel1',otdel,NULL)) AS 'otdel1', COUNT(IF(otdel='otdel2',otdel,NULL)) AS 'otdel2', COUNT(IF(otdel='otdel3',otdel,NULL)) AS 'otdel3' FROM bd GROUP BY name_comp Запрос
Я накалякал такую хрень PHP: SET @s = CONCAT('SELECT `name_comp`, COUNT(*) AS `', ( SELECT GROUP_CONCAT(DISTINCT `otdel` SEPARATOR '`, COUNT(*) AS `' ) FROM `bd`) , '` FROM `bd` GROUP BY `otdel`'); PREPARE stmt FROM @s; EXECUTE stmt; но как забить её правильными данными - не решил. Вернее, я знаю что можно использовать циклы и составить стек запросов и объединить результат с помощью UNION. Вообще-то всё равно такой подход требует создания хранимой процедуры.
Думаю, таблицу переделать comp добавив столбик otdel (при изменении строку bd.comp также параллельно менять данные в comp.otdel), и с comp таблицы делать сводный отчет
Решил так: без таблиц otdel Код (Text): SELECT p.name_comp, COUNT(IF(pp.otdel='otdel1',pp.otdel,NULL)) AS 'otdel1', COUNT(IF(pp.otdel='otdel2',pp.otdel,NULL)) AS 'otdel2', COUNT(IF(pp.otdel='otdel3',pp.otdel,NULL)) AS 'otdel3', COUNT(IF(pp.otdel<>'',pp.otdel,NULL)) AS 'itog' FROM comp AS p LEFT JOIN bd as pp ON (p.name_comp = pp.name_comp) GROUP BY p.name_comp ASC