Mysql 通过子查询相同的表来创建视图

Mysql 通过子查询相同的表来创建视图,mysql,view,subquery,Mysql,View,Subquery,我有一个包含以下列的表: 表1: YR Name Code --------------------- 2011 A 1a 2012 A 2a 2013 A 3a Name 2013Code 2012Code 2011Code --------------------------------------------------------------- A 1

我有一个包含以下列的表:

表1

YR     Name     Code 
---------------------
2011     A       1a      
2012     A       2a 
2013     A       3a
Name     2013Code     2012Code     2011Code
---------------------------------------------------------------
A           1a           2a           3a
我想创建一个如下所示的视图:

SET @query = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN yr = ''', yr, ''' THEN code END) AS ', yr, 'code')) INTO @query FROM myTable;
SET @query = CONCAT('SELECT name, ', @query, ' FROM myTable GROUP BY name');
视图1

YR     Name     Code 
---------------------
2011     A       1a      
2012     A       2a 
2013     A       3a
Name     2013Code     2012Code     2011Code
---------------------------------------------------------------
A           1a           2a           3a

我是否使用子查询来填充每一列

如果您只有这三个(或几个有限年值),您可以使用case语句轻松地透视此表:

CREATE VIEW view1 AS
SELECT 
  name, 
  MAX(CASE WHEN yr = 2013 THEN code END) AS '2013Code',
  MAX(CASE WHEN yr = 2012 THEN code END) AS '2012Code',
  MAX(CASE WHEN yr = 2011 THEN code END) AS '2011Code'
FROM myTable
GROUP BY name;
然而,如果您需要动态的东西,我会参考一些关于动态数据透视表的信息。查询如下所示:

SET @query = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN yr = ''', yr, ''' THEN code END) AS ', yr, 'code')) INTO @query FROM myTable;
SET @query = CONCAT('SELECT name, ', @query, ' FROM myTable GROUP BY name');
第一部分将设置模板,以选择年份值作为列名,而第二部分将从表中选择这些值并按名称分组。唯一要做的就是执行这个准备好的语句:

PREPARE stmt FROM @query;
EXECUTE stmt;

这是一个包含硬编码和动态版本的示例,您可以看到它们产生相同的结果。

表中是否只有这三年,或者您需要动态的东西?需要多大的灵活性?不需要动态的,我主要想创建它,以查看这些年之间是否有任何变化。我有2008年和2014年的数据,我想你的结果回到了-front@OK_Sooner你还在解决这个问题吗?