4

さまざまなデータベースの行を列にピボットすることに関する投稿がたくさんあります。それらは、case ステートメントを使用するか、データベース ベンダーの組み込み関数を使用するかの 2 つの陣営に分類されるようです。私はMySQLを使用していますが、列にピボットしたい任意の未知数の行値をピボットできる組み込み関数については、これまでのところ何も見つかりませんでした。値が事前にわからないと、stackoverflow でよく出てくる CASE クエリを構築できません。MySQL に、クロスタブまたはピボットと呼ばれる他のデータベースに類似したものがあるかどうかを知りたいです。

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

行を列にピボットすると言うときに何を求めているのかを明確にするために、このようなテーブルを変換したいと思います

user_id キー値
ボブの髪 茶色の
ボブの目 青い
ジェイクの髪 茶色のジェイクの
高さ 6'2"

これに:

user_id 髪 目の高さ
ボブ ブラウン ブルー        
ジェイク ブラウン 6'2"

私は特にMySQLのソリューションを探しているので、これを解決できるデータベース固有の新しいものや、あなたが知っていることがあれば、それは大歓迎です.

4

1 に答える 1

2

Kangkan が提供したリンクは、事前に列名を知っていれば、これを実行する方法を示しています。動的 SQL を使用してステートメントを作成することを除いて、同じロジックを使用します。含める必要がある各フィールドには 2 つの部分があります。select ステートメントのフィールドと、値を取得するための適切な結合です。したがって、ステートメントを 2 つの部分に分けて作成する必要があります。

まず、これを構築するために 3 つの変数を宣言します。この例では、@select、@join、および @sql を使用します。変数に初期値を与える

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

table.key フィールドに個別の値を持つカーソルを宣言してロードします。変数には個別の table.key フィールドが入力されるため、@field を使用します。次に、ループして 2 つの変数を作成します。

 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 の値をテーブルのエイリアスとして使用するように設計されています)

@select と @join を構築するカーソルをループします。ループの最後に:

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

このように構築された動的 SQL は、トラブルシューティング (および正しく行う) とセキュリティの問題を開くのに絶対的な苦痛になる可能性があります... しかし、これが達成されるのを見ることができる唯一の方法です。変数のサイズ制限に注意してください...そこに個別のキーが多すぎると、変数が大きくなりすぎます。申し訳ありませんが、これについて疑似をより正確に表現することはできません... sql で動的 sql を構築するのは骨の折れる作業です。

于 2010-12-23T22:56:05.367 に答える