2015-04-26 2 views
1

У меня есть таблица, как это в MySQL:MySQL: Выбор каждого члена в качестве столбца в группе заявлением

PersonID id  X 
1   1   0 
1   2   1 
1   3   1 
1   4   1 
2   1   1 
2   2   0 
2   3   0 
2   4   1 
3   1   1 
3   2   0 

Etc. X является бинарным - либо 1 или 0. Просто предположит, что это случайное.

Я хочу, чтобы получить результат запроса, как это:

PersonID X1 X2 X3 X4 
1   0 1 1 1 
2   1 0 0 1 
3   1 0 NULL NULL 

Как это сделать? Я попробовал следующее:

select 
PersonID, 
case when id = 1 then X else NULL end as X1, 
case when id = 2 then X else NULL end as X2, 
et cetera 
from table 
group by PersonID 

который, очевидно, не так, и будет длиться вечно, чтобы писать (так как у меня до 700 различных идентификаторов для каждого человека), но это лучшее, что я могу думать.

+0

Таким образом, у вас может быть 700 различных идентификаторов '1,2,3 ... 700'? –

+0

Да. И 700 разных столбцов. Непротиворечивый, но необходимый, к сожалению, – japem

+0

, в этом случае вам нужно будет использовать динамический sql для создания сводной таблицы. Проверьте динамический pivot mysql и убедитесь, что номера столбцов не пересекаются 4096 –

ответ

0

Вы ищете функции агрегации. Для четырех колонок:

select PersonID, 
     max(case when id = 1 then X else NULL end) as X1, 
     max(case when id = 2 then X else NULL end) as X2, 
     max(case when id = 3 then X else NULL end) as X3, 
     max(case when id = 4 then X else NULL end) as X4 
from table 
group by PersonID; 

Я вас беспокоит письменном код, просто поместите список идентификаторов в таблице, используйте формулу для создания соответствующего кода, и скопируйте обратно в SQL запрос.

Если у вас неизвестное количество идентификаторов, вам может понадобиться использовать динамический SQL. В качестве альтернативы вы можете объединить значения вместе:

select PersonID, 
     group_concat(x order by id) as xs 
from table 
group by PersonID; 
+0

Для 700 значений это должно быть бонкерами – Strawberry

Смежные вопросы