-1

別のプラグインから使用する MYSQL テーブルがあります。テーブルには、element_value と element_label という 2 つのフィールドがあります。

element_value には、レポートを作成する 2500 人の名前、住所、都市、州、および郵便番号が含まれています。しかし、各行を取得して独自の列を作成したいと思います。

たとえば、テーブルは次のようになります。

**element_value**
John Smith
100 Elm Street
Columbus
Ohio
13579

element_label はインデックスとして使用されます。element_label 1 は名前、2 は住所、3 は都市などです。

データを列に表示できるようにしたい:

Name       Address        City       State       Zip
John Smith 100 Elm Street Columbus   Ohio        13579

これを行うために MYSQL ステートメントを使用する方法を考えられる人はいますか?

4

1 に答える 1

0

行から列へのこのタイプの変換は、ピボットと呼ばれます。MySQL にはピボット関数がありませんが、これはCASE式を含む集計関数を使用して複製できます。

以下を使用できます。

select
  max(case when element_label = 'Name' then element_value end) Name,
  max(case when element_label = 'Address' then element_value end) Address,
  max(case when element_label = 'State' then element_value end) State,
  max(case when element_label = 'City' then element_value end) City,
  max(case when element_label = 'Zip' then element_value end) Zip
from yt

SQL Fiddle with Demoを参照してください。

列に変換する値の数が不明な場合は、準備済みステートメントを使用して動的 SQL を生成できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN element_label = ''',
      element_label,
      ''' THEN element_value else null END) AS `',
      element_label, '`'
    )
  ) INTO @sql
FROM yt;

SET @sql 
  = CONCAT('SELECT ', @sql, ' 
            from yt
            ');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQL Fiddle with Demoを参照してください。両方のクエリの結果は次のとおりです。

|       NAME |        ADDRESS |     CITY | STATE |   ZIP |
----------------------------------------------------------
| John Smith | 100 Elm Street | Columbus |  Ohio | 13579 |

通常、グループ化する列もあります。たとえば、record_id 列がある場合、 を追加するとGROUP BY record_id、複数の結果行が返されます。

于 2013-04-07T21:21:27.847 に答える