sql >> データベース >  >> RDS >> Mysql

CASEを使用せずにMySQLの行を列にピボットする方法はありますか?

    カンカンが提供したリンクは、事前に列名を知っていた場合にこれを実行する方法を示しています。動的SQLを使用してステートメントを作成することを除いて、同じロジックを使用します。各フィールドには、selectステートメントのフィールドと、値を取得するための適切な結合の2つの部分があります。したがって、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 '[email protected]+'
     set @join = @join + ' left join table ' + @field + 'on '[email protected]+'.key = t.key and and '[email protected]+'.user_id = t.user_id
    

    (結合は、@ fieldの値をテーブルのエイリアスとして使用するように設計されています)

    カーソルをループして@selectと@joinを作成します。ループの最後:

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

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




    1. MySQL-1対1の関係?

    2. DBリクエストをインターセプトする方法は? (MySQL)

    3. FOREIGN KEY制約によって参照されているため、オブジェクトを削除できませんでした-SQL Server/TSQLチュートリアルパート74

    4. Rails、MySQL、Snow Leopard