我的数据库中有两列名称和年份。像这样的东西,
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个不同的名字。
答案 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 here。 corresponding queries are here。