2013-07-01 32 views
0

我在數據庫中有兩列名稱和年份的數據。像這樣的,MySql查詢從數據庫中以矩陣形式提取數據

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 

tim | pol | ron根據累計和即tim(5),pol(3),ron(2)以降序排列。

數據不限於tim,pol,ron。可以有n個不同的名字。

+0

請參閱http://stackoverflow.com/questions/7674786/mysql-pivot-table –

回答

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

+0

數據不僅限於tim,pol,ron。可以有n個不同的名字。 – Zero

+0

+1對於不使用總和如果 – Stephan

+0

@JohnGalt在MySQL中的樞軸是靜態的,所以你必須使用你需要的n列自己構建查詢 – Stephan

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

雖然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)。)
  • 的行判別索引minant(即。在你的情況下,(year)

但較大的結果(無論是多行或多列或兩者),速度越快它執行比通常的做法。我發佈了一些sample data here,如果任何人都喜歡玩它。該corresponding queries are here