MySql查询从数据库中以矩阵形式提取数据

时间:2013-07-01 08:31:13

标签: mysql matrix

我的数据库中有两列名称和年份。像这样的东西,

name | year
-----------
tim  | 2001
ron  | 2002
tim  | 2003
ron  | 2005
tim  | 2004
pol  | 2002
pol  | 2001
tim  | 2003
pol  | 2004
tim  | 2002

我想输出像这样的结果矩阵。

      tim | pol | ron
2001   1  |  1  |  0
2002   1  |  1  |  1
2003   2  |  0  |  0
2004   1  |  1  |  0
2005   0  |  0  |  1
时间| pol | ron按累积和的顺序排列,即tim(5),pol(3),ron(2)。

数据不仅限于tim,pol,ron。可以有n个不同的名字。

3 个答案:

答案 0 :(得分:4)

SELECT
  year,
  SUM(name='tim') tim,
  SUM(name='pol') pol,
  SUM(name='ron') ron
FROM
  yourtable
GROUP BY
   year

请参阅小提琴here

编辑:如果您需要动态查询,因为确切的数值可能会有所不同,您可以使用这样的预准备语句:

SELECT
  CONCAT('SELECT year,',
  GROUP_CONCAT(sums),
  ' FROM yourtable GROUP BY year')
FROM (
SELECT CONCAT('SUM(name=\'', name, '\') AS `', name, '`') sums
FROM yourtable
GROUP BY name
ORDER BY COUNT(*) DESC
) s
INTO @sql;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

小提琴是here

答案 1 :(得分:0)

您可以执行以下操作,然后在演示层转置它。

SELECT yourtable.year, Hits.name, Hits.hit
FROM yourtable
LEFT JOIN (SELECT
 year, name, count(*) as hit
FROM
  yourtable
GROUP BY
   year, name) AS Hits ON yourtable.year = Hits.year
GROUP BY yourtable.year, yourtable.name

缺少无命中,即那些不会在某一年内落下的名字,即您不会看到任何 0 。< / p>

答案 2 :(得分:0)

虽然fthiella的方法是构建数据透视表的最常用方法,但您可能希望尝试此查询,这在大多数情况下更快:

SELECT
  years.year,
  COALESCE(tim.c, 0) AS tim,
  COALESCE(pol.c, 0) AS pol,
  COALESCE(pol.c, 0) AS ron
FROM (SELECT year FROM yourtable GROUP BY year) AS years
LEFT JOIN (
  SELECT COUNT(name) AS c, year FROM yourtable WHERE name = 'tim' GROUP BY year
) AS tim ON (tim.year = years.year)
LEFT JOIN (
  SELECT COUNT(name) AS c, year FROM yourtable WHERE name = 'pol' GROUP BY year
) AS pol ON (pol.year = years.year)
LEFT JOIN (
  SELECT COUNT(name) AS c, year FROM yourtable WHERE name = 'ron' GROUP BY year
) AS ron ON (ron.year = years.year)
GROUP BY years.year;

这写起来有点痛苦,而且要表现好,它需要两个索引:

  • 用作列和行判别式的两个字段的两列索引,按此顺序排列(例如,在您的情况下,按此顺序在(name, year)上)
  • 行判别式的索引(例如,在您的情况下,在(year)上)

但结果越大(更多行或更多列或两者),与通常的方法相比,它的执行速度越快。如果有人想要玩它,我发布了一些sample data herecorresponding queries are here

相关问题