MySQL - строки в столбцы - PullRequest
       108

MySQL - строки в столбцы

160 голосов
/ 07 августа 2009

Я пытался искать сообщения, но нашел только решения для SQL Server / Access. Мне нужно решение в MySQL (5.X).

У меня есть таблица (называемая историей) с 3 столбцами: hostid, itemname, itemvalue.
Если я сделаю выбор (select * from history), он вернет

   +--------+----------+-----------+
   | hostid | itemname | itemvalue |
   +--------+----------+-----------+
   |   1    |    A     |    10     |
   +--------+----------+-----------+
   |   1    |    B     |     3     |
   +--------+----------+-----------+
   |   2    |    A     |     9     |
   +--------+----------+-----------+
   |   2    |    c     |    40     |
   +--------+----------+-----------+

Как запросить базу данных, чтобы получить что-то вроде

   +--------+------+-----+-----+
   | hostid |   A  |  B  |  C  |
   +--------+------+-----+-----+
   |   1    |  10  |  3  |  0  |
   +--------+------+-----+-----+
   |   2    |   9  |  0  |  40 |
   +--------+------+-----+-----+

Ответы [ 12 ]

1 голос
/ 10 октября 2013

Это не точный ответ, который вы ищете, но это было решение, которое мне было нужно в моем проекте, и надеюсь, что это кому-то поможет. Это перечислит от 1 до n строк, разделенных запятыми. Group_Concat делает это возможным в MySQL.

select
cemetery.cemetery_id as "Cemetery_ID",
GROUP_CONCAT(distinct(names.name)) as "Cemetery_Name",
cemetery.latitude as Latitude,
cemetery.longitude as Longitude,
c.Contact_Info,
d.Direction_Type,
d.Directions

    from cemetery
    left join cemetery_names on cemetery.cemetery_id = cemetery_names.cemetery_id 
    left join names on cemetery_names.name_id = names.name_id 
    left join cemetery_contact on cemetery.cemetery_id = cemetery_contact.cemetery_id 

    left join 
    (
        select 
            cemetery_contact.cemetery_id as cID,
            group_concat(contacts.name, char(32), phone.number) as Contact_Info

                from cemetery_contact
                left join contacts on cemetery_contact.contact_id = contacts.contact_id 
                left join phone on cemetery_contact.contact_id = phone.contact_id 

            group by cID
    )
    as c on c.cID = cemetery.cemetery_id


    left join
    (
        select 
            cemetery_id as dID, 
            group_concat(direction_type.direction_type) as Direction_Type,
            group_concat(directions.value , char(13), char(9)) as Directions

                from directions
                left join direction_type on directions.type = direction_type.direction_type_id

            group by dID


    )
    as d on d.dID  = cemetery.cemetery_id

group by Cemetery_ID

Это кладбище имеет два общих имени, поэтому имена перечислены в разных строках, связанных одним идентификатором, но двумя идентификаторами имен, и запрос выдает что-то вроде этого

CemeteryID Cemetery_Name Широта
1 Эпплтон, Сульфер-Спрингс 35.4276242832293

0 голосов
/ 19 июня 2019

Если бы вы могли использовать MariaDB , есть очень простое решение.

Начиная с MariaDB-10.02 был добавлен новый механизм хранения под названием CONNECT , который может помочь нам преобразовать результаты другого запроса или таблицы в сводную таблицу, как ты хочешь: Вы можете взглянуть на документы .

Прежде всего установить механизм подключения хранилища .

Теперь столбец сводной таблицы нашей таблицы равен itemname, а данные для каждого элемента расположены в столбце itemvalue, поэтому мы можем получить сводную таблицу результатов с помощью этого запроса:

create table pivot_table
engine=connect table_type=pivot tabname=history
option_list='PivotCol=itemname,FncCol=itemvalue';

Теперь мы можем выбрать то, что мы хотим из pivot_table:

select * from pivot_table

Подробнее здесь

...