как преобразовать вертикальные поля в таблице в горизонтальный результат с помощью SQL - PullRequest
1 голос
/ 06 февраля 2012

У меня есть такая таблица:

create table t1 {
  person_id int,
  item_name varchar(30),
  item_value varchar(100)
};

Предположим, что person_id + item_name является составным ключом, теперь у меня есть некоторые данные (5 записей) в таблице t1, как показано ниже:

person_id ====item_name ====== item_value
   1          'NAME'           'john'
   1          'GENDER'         'M'
   1          'DOB'            '1970/02/01'
   1          'M_PHONE'        '1234567890'
   1          'ADDRESS'        'Some Addresses unknown'

Теперь я хочу использовать SQL (или прочесывать процедуру / функцию хранилища или что-то еще), чтобы запросить приведенный выше результат (1 набор результатов):

NAME==GENDER==DOB========M_PHONE=======ADDRESS===============
1     M       1970/02/01 1234567890    Some Addresses unknown

Как мне это сделать?Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Независимо от базы данных, которую вы используете, концепция того, что вы пытаетесь достичь, называется «сводная таблица».

Вот пример для mysql: http://en.wikibooks.org/wiki/MySQL/Pivot_table

Некоторые базы данныхдля этого есть встроенные функции, см. ссылки ниже.

SQLServer: http://msdn.microsoft.com/de-de/library/ms177410.aspx

Oracle: http://www.dba -oracle.com / t_pivot_examples.htm

Вы всегда можете создать пивот вручную.Просто выберите все агрегаты в наборе результатов, а затем выберите из этого набора результатов.Обратите внимание, что в вашем случае вы можете поместить все имена в один столбец, используя concat (я думаю, что это - group_concat в mysql), поскольку вы не можете знать, сколько имен связано с person_id.

0 голосов
/ 07 февраля 2012

Наконец, я нашел решение в PostgreSQL:

select * from crosstab ('select person_id,  item_name, item_value from t1 where person_id = 1 ') 
as virtual_table ( person_id integer, name varchar, gender varchar, dob varchar, m_phone varchar, address varchar)

Также необходимо установить функцию кросс-таблицы на Postgres.Подробнее: http://www.postgresql.org/docs/8.3/static/tablefunc.html

...