Mysql 通过子查询相同的表来创建视图
我有一个包含以下列的表: 表1: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
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你还在解决这个问题吗?