Есть ли способ разворачивать строки в столбцы в MySQL без использования CASE? - PullRequest
4 голосов
/ 02 ноября 2010

Существует множество публикаций о поворотах строк в столбцах для различных баз данных.Похоже, они делятся на два лагеря, используя операторы case или встроенную функцию поставщика базы данных.Я использую MySQL и пока не нашел ничего ни в одной встроенной функции, которая позволила бы мне поворачиваться на произвольном неизвестном количестве значений строк, которые я хочу поворачивать в столбцы.Если я не знаю значений заранее, я не могу построить CASE-запросы, которые часто появляются в stackoverflow.Я хочу знать, есть ли что-то подобное в MySQL в других базах данных, где это называется crosstab или pivot:

-Postgresql: http://www.postgresql.org/docs/current/static/tablefunc.html
-Oracle: http://www.oracle -base.com / статьи / 11g / PivotAndUnpivotOperators_11gR1.php -SQL Server: http://msdn.microsoft.com/en-us/library/ms177410.aspx

Просто чтобы убедиться, что я понимаю, о чем я прошу, когда я говорю сводные строки к столбцам, я хочу преобразовать таблицу следующим образом

значение ключа user_id каштановые волосы каштановыеголубые глазаДжейк волосы коричневыевысота Джейка 6'2 "

В это:

user_id высота волос боб коричневый синийДжейк Браун 6'2 "

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

1 Ответ

2 голосов
/ 24 декабря 2010

Ссылка, предоставленная Kangkan, покажет вам, как это сделать, если вы заранее знали имена столбцов.Мы используем ту же логику, за исключением использования динамического SQL для построения оператора.В каждое поле необходимо включить 2 части: поле в операторе выбора и соответствующее объединение, чтобы получить значение ... поэтому нам нужно будет построить оператор из двух частей

Первое объявление3 переменные, чтобы построить это ... Я пойду с @select, @join и @sql для этого примера.Дайте переменным начальные значения

 set @select = 'select user_id,'
 set @join = 'from table t'

, теперь объявите и загрузите курсор с различными значениями в поле table.key.Я собираюсь использовать @field, поскольку переменная заполняется отдельным полем table.key.Затем выполните цикл по нему, создав две переменные:

 set @select = @select + ', ' + @field + '.value as '+@field+'
 set @join = @join + ' left join table ' + @field + 'on '+@field+'.key = t.key and and '+@field+'.user_id = t.user_id

(объединение предназначено для использования значения в @field в качестве псевдонима таблицы)

цикл по построению курсора из @выберите и @join.В конце цикла:

set @sql = @select + @join + 'where clause if you want'
exec @sql

Динамический SQL, созданный таким образом, может стать абсолютной болью для устранения неполадок (и получения правильных результатов) и открытия проблем безопасности ... но это единственный способ, которым я могуувидеть это выполненнымСледите за ограничением размера ваших переменных .... если у вас слишком много разных ключей, переменные становятся слишком большими.Извините, я не могу быть более точным с псевдо-этим ... вы обнаружите, что создание динамического SQL в SQL является кропотливым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...