-4

我有一张有 170 万行的表。表结构为 (Datapoint,AttributeName,AttributeValue)。

第一列即数据点是这样的:
(1,属性名称1,属性值1)
(1,属性名2.属性值2)
.
.
n次
(2,属性名1,属性值1)
(2,属性名2,属性值2)
.
.
米次
(11113,属性名称1,属性值1)
(11113,属性名称2,属性值2)
.
.
时间

我需要在 SQL 中编写一个程序,将上述数据转换为以下格式:

(数据点,属性名称 1,属性名称 2,......属性名称)
(1, ,AttributeValue1,AttributeValue2,............)
(2, ,AttributeValue1,AttributeValue2,............)

(11113, ,AttributeValue1,AttributeValue2,............)

请让我知道如何去做。谢谢

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 回答