SQL テーブルの転置: 柔軟なデータ変換の実現
SQL の転置操作には、行から列への変換、またはその逆の変換が含まれます。これに関連して、ユーザー定義のフィールド名を持つテーブルをユーザー固有のデータに転置する問題に取り組んでみましょう。
問題:
user- を持つテーブルが与えられた場合定義されたフィールド名と対応する値。目標は、各ユーザーのデータが単一の行に表示され、列名がフィールドを表す形式に転置することです。 names.
例:
入力テーブル:
Id | UserId | FieldName | FieldValue |
---|---|---|---|
1 | 100 | Username | John Doe |
2 | 100 | Password | pass123! |
3 | 102 | Username | Jane |
4 | 102 | Password | $ecret |
5 | 102 | Email Address | [email protected] |
必要な出力:
UserId | Username | Password | Email Address |
---|---|---|---|
100 | John Doe | pass123! | NULL |
102 | Jane | $ecret | [email protected] |
ソリューションMySQL 内 (ANSI なし)構文):
MySQL は ANSI PIVOT/UNPIVOT 構文をサポートしていないため、条件付き集計アプローチを使用できます。
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 TABLE t GROUP BY t.userid
このアプローチは各行を反復処理し、CASE ステートメントを使用します。フィールド名に基づいて、目的の出力列に値を割り当てます。次に、各 userId の結果を集計します。
プリペアド ステートメントを使用した動的ソリューション:
ソリューションをより多用途にするために、MySQL のプリペアド ステートメント構文を使用できます。フィールドを動的に指定します:
SET @query = "SELECT userid, "; SET @enum_query = ""; SELECT CONCAT(@enum_query, "MAX(CASE WHEN fieldname = '", fieldname, "' THEN fieldvalue ELSE NULL END) AS ", fieldname,", ") INTO @enum_query FROM ( SELECT DISTINCT fieldname FROM TABLE ) AS subquery; SET @enum_query = SUBSTRING(@enum_query, 1, LENGTH(@enum_query) - 2); SET @query = CONCAT(@query, @enum_query, " FROM TABLE GROUP BY userid;"); PREPARE stmt FROM @query; EXECUTE stmt;
このアプローチでは、動的必要なフィールド名をすべて出力の列として含むクエリ。
以上が動的に生成された列を含む SQL テーブルを転置するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。