Переотображение/объединение в SQL
-
08-07-2019 - |
Вопрос
Я пытаюсь переупорядочить/сгруппировать набор результатов с помощью SQL.У меня есть несколько полей (которые для примера были переименованы во что-то менее конкретное), и в каждой логической группе записей есть поле, которое остается постоянным — поле адреса.Есть также поля, которые присутствуют для каждого адреса, они одинаковы для каждого адреса.
id forename surname address
1 John These Address1
2 Lucy Values Address1
3 Jenny Are Address1
4 John All Address2
5 Lucy Totally Address2
6 Jenny Different Address2
7 Steve And Address2
8 Richard Blah Address2
address John Lucy Jenny Steve Richard
Address1 These Values Are (null) (null)
Address2 All Totally Different And Blah
Например:Джон, Люси, Дженни, Стив и Ричард — единственные возможные имена по каждому адресу.Я знаю это, потому что оно хранится в другом месте.
Могу ли я выбрать значения из реальных записей на изображении слева и вернуть их в виде набора результатов, подобного показанному справа?Я использую MySQL, если это имеет значение.
Решение
Предполагая, что заголовки столбцов «Джон», «Люси» и т. д. фиксированы, вы можете сгруппировать их по полю адреса и использовать функции if() в сочетании с агрегатными операторами для получения результатов:
select max(if(forename='john',surname,null)) as john,
max(if(forename='lucy',surname,null)) as lucy,
max(if(forename='jenny',surname,null)) as jenny,
max(if(forename='steve',surname,null)) as steve,
max(if(forename='richard',surname,null)) as richard,
address
from tablename
group by address;
Хотя он немного хрупкий.
Существует также функция group_concat, которую можно использовать (в определенных пределах) для выполнения чего-то подобного, но она будет упорядочена по строкам, а не по столбцам, как вам кажется.
например.
select address, group_concat( concat( forename, surname ) ) tenants
from tablename
group by address;
Другие советы
Я не уверен, но я думаю, что вы пытаетесь сделать это GROUP BY.
SELECT Address,Name FROM Table GROUP BY Name
если вы хотите выбрать больше столбцов, убедитесь, что они включены в предложение GROUP BY. Кроме того, теперь вы можете выполнять агрегатные функции, такие как MAX () или COUNT ().
Я не уверен насчет вопроса, но из того, что я понимаю, вы можете сделать:
SELECT concat(column1,column2,column3) as main_column, address from table;