我有一个包含以下列的表:
表1 :
YR Name Code
---------------------
2011 A 1a
2012 A 2a
2013 A 3a
我想创建一个如下所示的视图:
查看1 :
Name 2013Code 2012Code 2011Code
---------------------------------------------------------------
A 1a 2a 3a
我是否使用子查询来填充每列?
答案 0 :(得分: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,它们都带有硬编码和动态版本,因此您可以看到它们会产生相同的结果。