-4

170 万行のテーブルがあります。テーブル構造は (Datapoint,AttributeName,AttributeValue) です。

最初の列、つまり Datapoint は次のようになります。
(1,属性名1,属性値1)
(1,属性名2.属性値2)
.
.
n回
(2,属性名1,属性値1)
(2,属性名2,属性値2)
.
.
百万回
(11113,属性名1,属性値1)
(11113,属性名2,属性値2)
.
.
ptimes

上記のデータを以下の形式に変換する SQL でプロシージャを記述する必要があります。

(Datapoint,AttributeName1,AttributeName2,........AttributeNamen)
(1, ,属性値1,属性値2,.................................)
(2, ,属性値1,属性値2,.................................)

(11113, ,属性値1,属性値2,.................................)

どうすればいいのか教えてください。ありがとう

4

1 に答える 1

1

MySQL にはピボットCASE関数がありませんが、式を含む集計関数を使用して、データを行から列に変換できます。

select datapoint,
  max(case when AttributeName ='AttributeName1' then AttributeValue end) as AttributeName1,
  max(case when AttributeName ='AttributeName2' then AttributeValue end) as AttributeName2,
  max(case when AttributeName ='AttributeName3' then AttributeValue end) as AttributeName3,
  max(case when AttributeName ='AttributeName4' then AttributeValue end) as AttributeName4
from yourtable
group by datapoint

上記のバージョンは、値の数がわかっている場合にうまく機能します。ただし、列に変換するアイテムの数が不明な場合は、準備済みステートメントを使用して動的 SQL を生成する必要があります。次の記事を確認してください。

動的ピボット テーブル (行を列に変換)

コードは次のようになります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN AttributeName = ''',
      AttributeName,
      ''' THEN AttributeValue END) AS `',
      AttributeName, '`'
    )
  ) INTO @sql
FROM yourtable;


SET @sql 
  = CONCAT('SELECT datapoint, ', @sql, ' 
           from yourtable
           group by datapoint');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-03-20T23:20:48.503 に答える