MySQL で複数の条件を使用して行を列に動的に変換する
質問:
どうすればよいですかMySQL の 2 つの基準に基づいて行を列に動的に変換します。 columns?
コンテキスト:
テーブルには、各行に「data」と「price」という名前の列を持つ複数の行が含まれています。目標は、データと価格の一意の組み合わせを表す列と、対応する行データを含む各セルを含む新しいテーブルにテーブルを変換することです。
解決策:
複数の条件に基づいて行を列に動的に変換するには、MySQL 関数と動的SQL.
まず、元のテーブルをアンピボットして、データの一意の組み合わせごとに複数の行を含む新しいテーブルを作成します。
SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA;
次に、CASE ステートメントを使用して、アンピボットされたデータを列に集計します。
SELECT id, MAX(CASE WHEN col = 'order1' THEN value END) AS order1, MAX(CASE WHEN col = 'order2' THEN value END) AS order2, MAX(CASE WHEN col = 'order3' THEN value END) AS order3, MAX(CASE WHEN col = 'item1' THEN value END) AS item1, MAX(CASE WHEN col = 'item2' THEN value END) AS item2, MAX(CASE WHEN col = 'item3' THEN value END) AS item3 FROM ( SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA ) d GROUP BY id;
クエリを動的にするには、準備されたステートメントを使用し、動的に元のテーブルの一意の列に基づいて CASE ステートメントを生成します。
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(CASE WHEN col = ''', col, ''' THEN value END) AS `', col, '`') ) INTO @sql FROM ( SELECT CONCAT('order', `order`) AS col FROM tableA UNION ALL SELECT CONCAT('item', `item`) AS col FROM tableA ) d; SET @sql = CONCAT('SELECT id, ', @sql, ' FROM ( SELECT id, CONCAT(''order'', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT(''item'', item) AS col, price AS value FROM tableA ) d GROUP BY id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
この動的クエリは、任意の数の一意の基準を処理し、必要な変換されたテーブルを生成します。
以上が複数の基準に基づいて MySQL で行を列に動的にピボットする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。