SQL では、テーブルを転置するには、行指向のテーブルを列指向のテーブルに変換する必要があります。これは、ユーザー概要レポートの作成など、さまざまなシナリオで役立ちます。
SQL で転置を実現する 1 つのアプローチは、CASE ステートメントを使用することです。提供された例に示すように、列 Id、UserId、FieldName、および FieldValue を持つテーブルを考えてみましょう。
SELECT t.userid, MAX(CASE WHEN t.fieldname = 'Username' THEN t.fieldvalue ELSE NULL END) AS Username, MAX(CASE WHEN t.fieldname = 'Password' THEN t.fieldvalue ELSE NULL END) AS Password, MAX(CASE WHEN t.fieldname = 'Email Address' THEN t.fieldvalue ELSE NULL END) AS Email FROM t GROUP BY t.userid
このクエリは、ユーザーを UserId でグループ化し、対応するフィールド値をユーザー名、パスワード、電子メール アドレスの列。
ただし、この方法ではフィールドごとに CASE ステートメントを定義する必要があり、面倒で面倒な場合があります。柔軟性がない。これを動的にするには、MySQL のプリペアド ステートメント (動的 SQL) 構文を利用できます。
SET @sql = CONCAT("SELECT userid"); -- Dynamically create the field selection part SET @field_list = ( SELECT GROUP_CONCAT( CONCAT('MAX(CASE WHEN t.fieldname = ''', fieldname, ''' THEN t.fieldvalue ELSE NULL END) AS ', fieldname) ) FROM t GROUP BY userid ); SET @sql = CONCAT(@sql, ", ", @field_list); SET @sql = CONCAT(@sql, " FROM t GROUP BY userid"); PREPARE stmt FROM @sql; EXECUTE stmt;
このクエリは、サブクエリの結果を使用して動的 SQL ステートメントを構築し、フィールド選択部分を決定します。 GROUP_CONCAT 関数を使用して CASE ステートメントを連結し、動的に構築された SQL クエリが有効であることを確認します。
動的 SQL を利用することで、CASE ステートメントを手動で定義する必要がなく、柔軟性が維持され、クエリで任意の数を処理できるようになります。ユーザー定義フィールドの数。
以上が準備されたステートメントを使用して SQL のテーブルを動的に転置する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。