MySQL多维视图选择

MySQL多维视图选择,mysql,select,view,multidimensional-array,Mysql,Select,View,Multidimensional Array,我想逐年显示重新排列的数据,其中一个可能的解决方案是使用视图并从中进行选择。数据矩阵类似于(当然,这是一个虚构的演示数据集): 创建和填充表的SQL代码为: DROP TABLE IF EXISTS `tab1`;<br> CREATE TABLE `tab1` ( <br> `id1` int(4) unsigned NOT NULL AUTO_INCREMENT, `iso3` char(3) NOT NULL, `year` int(4) unsigne

我想逐年显示重新排列的数据,其中一个可能的解决方案是使用视图并从中进行选择。数据矩阵类似于(当然,这是一个虚构的演示数据集):

创建和填充表的SQL代码为:

DROP TABLE IF EXISTS `tab1`;<br>
CREATE TABLE `tab1` ( <br>
  `id1` int(4) unsigned NOT NULL AUTO_INCREMENT,
  `iso3` char(3) NOT NULL,
  `year` int(4) unsigned NOT NULL,
  `aaa` int(10) DEFAULT NULL, 
  `bbb` int(10) DEFAULT NULL, 
  PRIMARY KEY (`id1`) 
)


INSERT INTO `tab1` VALUES 
('1', 'USA', '2005', '22', '156'),
('2', 'CAN', '2005', '14', '101'), 
('3', 'MEX', '2005', '5', '32'),   
('4', 'USA', '2006', '24', '160'), 
('5', 'CAN', '2006', '16', '103'), 
('6', 'USA', '2007', '26', '163'), 
('7', 'MEX', '2007', '8', '35');   
COMMIT; 
然而,下面的SQL代码省略了所有缺少数据的行,不管是一个值,还是我只得到一行

 USA    22  24  26
SQL代码是:

 SELECT view2005.Country, view2005.2005, view2006.2006, view2007.2007 
 FROM   view2005, view2006, view2007 
 WHERE  view2005.country = view2006.country 
 AND    view2005.country = view2007.country   

知道怎么做吗,包括缺少数据的行?提前感谢。

使用
JOIN
比使用
WHERE
隐式连接更好。另外一个优点是,您可以将其转换为
左联接
,这样2005年没有与2006年相关的行(并且不匹配)的数据仍将显示

按照正确的建议使用Galz的解决方案或搜索来创建PIVOT查询


创建透视查询的一种逻辑是:

 SELECT iso3 AS Country
      , SUM(IF(year=2005, aaa, 0)) AS 2005
      , SUM(IF(year=2006, aaa, 0)) AS 2006
      , SUM(IF(year=2007, aaa, 0)) AS 2007 
 FROM  tab1 AS t
 GROUP BY iso3
如果有没有任何数据的年份,您将在该列中获得
NULL

如果希望显示
0
而不是
NULL
,则可以使用
COALESCE()
函数:

 SELECT iso3 AS Country
      , COALESCE( SUM( IF(year=2004, aaa, 0) ) , 0) AS "2004" 
      , COALESCE( SUM( IF(year=2005, aaa, 0) ) , 0) AS "2005"
      , COALESCE( SUM( IF(year=2006, aaa, 0) ) , 0) AS "2006"
      , COALESCE( SUM( IF(year=2007, aaa, 0) ) , 0) AS "2007" 
 FROM  tab1 AS t
 GROUP BY iso3

使用左连接和具有所有不同国家/地区的视图(或表,或如下所示的内部选择):

SELECT c.country, view2005.2005, view2006.2006, view2007.2007 
FROM (SELECT DISTINCT country FROM tab1) as c
LEFT JOIN view2005 ON view2005.country = c.country
LEFT JOIN view2006 ON view2006.country = c.country
LEFT JOIN view2007 ON view2007.country = c.country
GROUP BY c.country
编辑:


在更一般的上下文中,您在这里要求的是创建此表的透视,这是一个具有通用解决方案的常见问题。下面是一个很好的“操作方法”:

感谢Galz提供了到pivots的链接,感谢ypercube提供了SQL。在把年份用引号括起来,使它们变成字符后,它就起了作用

我更感兴趣的问题是,若我添加一行完全并没有值,或者一行超出了我添加的年份范围,会发生什么

INSERT INTO `tab1` VALUES 
('7', 'ATA', '2004', '', '')
结果是我得到了NULL和INT零值的混合。这是不好的,因为零是一个有效的数字和合法的数据。因此,我修改了查询以获得所需的准确结果:

SELECT iso3 AS countryб
       SUM( IF(year=2004, aaa, NULL) ) AS "2004",
       SUM( IF(year=2005, aaa, NULL) ) AS "2005",
       SUM( IF(year=2006, aaa, NULL) ) AS "2006",
       SUM( IF(year=2007, aaa, NULL) ) AS "2007"
 FROM  tab1
 GROUP BY iso3

没有2005年数据的国家如何?如果希望显示
0
而不是
NULL
,可以使用
COALESCE()
函数。
INSERT INTO `tab1` VALUES 
('7', 'ATA', '2004', '', '')
SELECT iso3 AS countryб
       SUM( IF(year=2004, aaa, NULL) ) AS "2004",
       SUM( IF(year=2005, aaa, NULL) ) AS "2005",
       SUM( IF(year=2006, aaa, NULL) ) AS "2006",
       SUM( IF(year=2007, aaa, NULL) ) AS "2007"
 FROM  tab1
 GROUP BY iso3