【问题标题】:Create views by subquerying same table通过子查询同一个表来创建视图
【发布时间】:2015-10-05 14:03:47
【问题描述】:

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

表 1

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

我想创建一个如下所示的视图:

查看 1

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

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

【问题讨论】:

  • 表中只有这三年,还是需要动态?
  • 它需要有多灵活?
  • 它不需要是动态的,我主要是想创建它以查看这些年之间是否有任何变化。我有 2008 年和 2014 年的数据
  • 我假设你的结果是从后到前的
  • @OK_Sooner 你还在解决这个问题吗?

标签: mysql view subquery


【解决方案1】:

如果您只有这三个(或几个有限年份值),您可以使用 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;

但是,如果您需要动态的东西,我会参考 this article 以获取有关动态数据透视表的信息。查询如下所示:

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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2016-07-26
    相关资源
    最近更新 更多