За последние 24 часа нас посетили 21797 программистов и 1690 роботов. Сейчас ищут 1868 программистов ...

Создать сводную таблицу mysql

Тема в разделе "MySQL", создана пользователем Daulet, 14 июл 2017.

  1. Daulet

    Daulet Активный пользователь

    С нами с:
    14 авг 2014
    Сообщения:
    49
    Симпатии:
    1
    Здравствуйте, как создать сводную таблицу с запросами
    есть 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___|
    ------------------------------------------------------
     
  2. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Циферки 2, 4, 0 ... - Это из таблицы bd?
     
  3. Daulet

    Daulet Активный пользователь

    С нами с:
    14 авг 2014
    Сообщения:
    49
    Симпатии:
    1
    Кол-во значение из bd (otdel1и name_comp1=2 шт)
    Базы Otdel и comp они уникальные
     
    #3 Daulet, 14 июл 2017
    Последнее редактирование: 14 июл 2017
  4. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Непростая (по крайней мере для меня) задача. Причем, многие решения, что есть в интернете используют заранее известное количество столбцов. Есть такой тип запросов PIVOT, но его реализации в MySQL толком нет.
    Если у меня чего получится, то обязательно отпишусь.
     
  5. retvizan

    retvizan Активный пользователь

    С нами с:
    27 дек 2013
    Сообщения:
    68
    Симпатии:
    22
    Обзор возможных вариантов есть тут. При неизвестном заранее кол-ве столбцов нужно использовать хранимую процедуру, которая посчитает кол-во столбцов, составит на основании того запрос и выполнит его.
     
    Maputo нравится это.
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Запости дамп базы для теста
     
  7. Daulet

    Daulet Активный пользователь

    С нами с:
    14 авг 2014
    Сообщения:
    49
    Симпатии:
    1
    Здравствуйте,

    Код (Text):
    1. -- Дамп структуры для таблица inver.otdel
    2. CREATE TABLE IF NOT EXISTS `otdel` (
    3.   `id` int(11) NOT NULL AUTO_INCREMENT,
    4.   `address` int(11) DEFAULT NULL,
    5.   `otdel` text,
    6.   KEY `id` (`id`)
    7. ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
    8.  
    9. -- Дамп структуры для таблица inver.comp
    10. CREATE TABLE IF NOT EXISTS `comp` (
    11.   `id` int(11) NOT NULL AUTO_INCREMENT,
    12.   `name_comp` text,
    13.   KEY `id` (`id`)
    14. ) ENGINE=InnoDB AUTO_INCREMENT=284 DEFAULT CHARSET=utf8;
    15.  
    16. -- Дамп структуры для таблица inver.bd
    17. CREATE TABLE IF NOT EXISTS `bd` (
    18.   `id` int(11) NOT NULL AUTO_INCREMENT,
    19.   `name_comp` text NOT NULL,
    20.   `otdel` text NOT NULL,
    21.   KEY `id` (`id`)
    22. ) ENGINE=InnoDB AUTO_INCREMENT=336 DEFAULT CHARSET=utf8;
     
  8. Daulet

    Daulet Активный пользователь

    С нами с:
    14 авг 2014
    Сообщения:
    49
    Симпатии:
    1
    [vs] нравится это.
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Вот это клево! Только пароль не подходит.
     
  10. Daulet

    Daulet Активный пользователь

    С нами с:
    14 авг 2014
    Сообщения:
    49
    Симпатии:
    1
    Извиняюсь, 123456dd
     
  11. Daulet

    Daulet Активный пользователь

    С нами с:
    14 авг 2014
    Сообщения:
    49
    Симпатии:
    1
    сделал только так, на таблицу bd, не вмешивая другие таблицы :(
    Код (Text):
    1. SELECT name_comp,
    2.     COUNT(IF(otdel='otdel1',otdel,NULL)) AS 'otdel1',
    3.     COUNT(IF(otdel='otdel2',otdel,NULL)) AS 'otdel2',
    4.     COUNT(IF(otdel='otdel3',otdel,NULL)) AS 'otdel3'
    5. FROM bd GROUP BY name_comp
    Запрос
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Я накалякал такую хрень
    PHP:
    1. SET @s = CONCAT('SELECT `name_comp`, COUNT(*) AS `', (
    2. SELECT GROUP_CONCAT(DISTINCT `otdel` SEPARATOR '`, COUNT(*) AS `'
    3. ) FROM `bd`)
    4. , '` FROM `bd` GROUP BY `otdel`');
    5. PREPARE stmt FROM @s;
    6. EXECUTE stmt;
    но как забить её правильными данными - не решил. Вернее, я знаю что можно использовать циклы и составить стек запросов и объединить результат с помощью UNION.
    Вообще-то всё равно такой подход требует создания хранимой процедуры.
     
    Daulet нравится это.
  13. Daulet

    Daulet Активный пользователь

    С нами с:
    14 авг 2014
    Сообщения:
    49
    Симпатии:
    1
    Думаю, таблицу переделать comp добавив столбик otdel (при изменении строку bd.comp также параллельно менять данные в comp.otdel), и с comp таблицы делать сводный отчет
     
  14. Daulet

    Daulet Активный пользователь

    С нами с:
    14 авг 2014
    Сообщения:
    49
    Симпатии:
    1
    Решил так: без таблиц otdel

    Код (Text):
    1. SELECT
    2.         p.name_comp,
    3.         COUNT(IF(pp.otdel='otdel1',pp.otdel,NULL)) AS 'otdel1',
    4.         COUNT(IF(pp.otdel='otdel2',pp.otdel,NULL)) AS 'otdel2',
    5.         COUNT(IF(pp.otdel='otdel3',pp.otdel,NULL)) AS 'otdel3',
    6.         COUNT(IF(pp.otdel<>'',pp.otdel,NULL)) AS 'itog'      
    7.     FROM comp AS p
    8.     LEFT JOIN bd as pp ON (p.name_comp = pp.name_comp) GROUP BY p.name_comp ASC