-1

我有一个我从另一个插件使用的 MYSQL 表。该表有两个字段,称为 element_value 和 element_label。

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