mysql - 将行显示为表中的列

标签 mysql sql select

我有一个像下面这样的表

CREATE TABLE Statistics(Stat_Id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                        Period  VARCHAR(55),
                        Location VARCHAR(255),
                        Rate_per_SqFt INT)

表格中的数据是

INSERT INTO Statistics(Period, Location, Rate_per_SqFt)
                VALUES('June', 'Location A', 2500),
                      ('June', 'Location B', 2740),
                      ('June', 'Location C', 3200),
                      ('July', 'Location A', 2650),
                      ('July', 'Location B', 2800),
                      ('July', 'Location C', 3250),
                      ('August', 'Location A', 2750),
                      ('August', 'Location B', 2950),
                      ('August', 'Location C', 3230),
                      ('October', 'Location A', 2950),
                      ('October', 'Location B', 3950),
                      ('October', 'Location C', 3530);

我希望特定月份的行在输出中显示为单独的列,如下所示

 Period   Location A     Location B     Location C 
 June        2500          2740           3200
 July        2650          2800           3250
 August      2750          2950           3230
 October     2950          3950           3530  

我如何使用查询来做到这一点

最佳答案

SELECT Period,
        MAX(CASE WHEN Location = 'Location A' THEN Rate_per_SqFt ELSE NULL END) `Location A`,
        MAX(CASE WHEN Location = 'Location B' THEN Rate_per_SqFt ELSE NULL END) `Location B`,
        MAX(CASE WHEN Location = 'Location C' THEN Rate_per_SqFt ELSE NULL END) `Location C`
FROM statistics
GROUP BY Period

如果您有未知数量的位置,则首选动态 SQL

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN Location = ''',
      Location,
      ''' then Rate_per_SqFt ELSE NULL end) AS ',
      CONCAT('`',Location,'`')
    )
  ) INTO @sql
FROM statistics;

SET @sql = CONCAT('SELECT Period, ', @sql, ' 
                   FROM Statistics 
                   GROUP BY Period');

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

关于mysql - 将行显示为表中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14079560/

相关文章:

php - 在 Mac OS X 上的 AMP 堆栈下安装 OpenCPU

sql - 如何将当前行与 PostgreSQL 中的下一行和上一行进行比较?

php - 如何使用 PHP 将 HTML 文档中的文本区域数据发送到 MySQL 数据库?

php - 当 WHERE 值是具有多于 1 行结果的子查询时如何更新行

php - php中二维数组的多重选择

mysql - 简单的 select, where 语句有问题

mysql - 错误 "Can' t 创建表...”添加外键

php - 为每个不同的行选择计数(mysql 和 php)

mysql - SUM 和 FORMAT 结合 MYSQL

javascript - 使用简单的 javascript 或 jQuery 模拟选择中所选选项的文本对齐中心