2013-04-08 89 views
-1

這可能嗎?我有以下表如何在PHP中按年計算一列中的項目數

ID CAR MODEL YEAR FUELTYPE 
1 Volvo S80 2007  GAS 
2 Volvo S80D 2007  DIESEL 
3 Volvo S80E 2009  LPN 

我想要做的是計算不同FUELTYPE的攀升,輸出會是這樣的,這是對谷歌圖我要使用的格式。

Year GAS DIESEL LPN 
2007 1  1 0 
2009 0  0 1 

我該怎麼用MySQL做到這一點?我可以做這樣的事嗎?

SELECT YEAR, COUNT(FUELTYPE) AS GAS, COUNT (FUELTYPE) AS DIESEL, COUNT (FUELTYPE) AS LPN 
FROM CARDATA 
GROUP BY FUELTYPE 
ORDER BY YEAR 

我知道這是不對的,因爲我在每個FUELTYPE得到相同的計數值 - 是它最好還是拉出來的mysql,然後用PHP來排序/算?

+1

如果你什麼 「GROUP BY YEAR,FUELTYPE」? – 2013-04-08 13:14:44

+0

@Anyone這將獲得作爲行計數,他們希望作爲列計數。 – Taryn 2013-04-08 14:00:19

回答

1

如果只有三個FuelType,在MySQL這個最簡單的方法是使用GROUP BYSUM()

SELECT Year, 
     SUM(FUELTYPE = 'GAS') GAS, 
     SUM(FUELTYPE = 'DIESEL') DIESEL, 
     SUM(FUELTYPE = 'LPN') LPN 
FROM CARDATA 
GROUP BY YEAR 

但是如果你有數量不明的FUELTYPE,動態SQL更加prefereed。

SET @sql = NULL; 

SELECT GROUP_CONCAT(DISTINCT 
     CONCAT('SUM(FUELTYPE = ''', 
       FUELTYPE, ''') AS ', 
       CONCAT('`', FUELTYPE, '`') 
       )) INTO @sql 
FROM CARDATA; 

SET @sql = CONCAT('SELECT Year, ', @sql, ' 
        FROM CARDATA 
        GROUP BY YEAR'); 

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

輸出

╔══════╦═════╦════════╦═════╗ 
║ YEAR ║ GAS ║ DIESEL ║ LPN ║ 
╠══════╬═════╬════════╬═════╣ 
║ 2007 ║ 1 ║  1 ║ 0 ║ 
║ 2009 ║ 0 ║  0 ║ 1 ║ 
╚══════╩═════╩════════╩═════╝ 
+1

感謝頂部的工作,因爲數據庫包含固定數量的FUELTYPE的 – user1557970 2013-04-08 15:07:40

+0

不客氣。但請記住,SUM(FUELTYPE ='LPN')'只在mysql中受支持。呵呵要更好的數據庫服務器友好,請參閱bluefeet的答案。它使用'CASE'。 ':)' – 2013-04-08 15:09:41

2

可以使用一個聚合官能團與CASE表達式樞軸行數據到列:

select year, 
    sum(case when fueltype = 'gas' then 1 else 0 end) gas, 
    sum(case when fueltype = 'diesel' then 1 else 0 end) diesel, 
    sum(case when fueltype = 'lpn' then 1 else 0 end) lpn 
from yt 
group by year 

SQL Fiddle with Demo見。

如果你有數目不詳的FuelType值,那麼你可以使用準備好的語句來生成動態SQL:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(CASE WHEN fueltype = ''', 
     fueltype, 
     ''' THEN 1 else 0 END) AS `', 
     fueltype, '`' 
    ) 
) INTO @sql 
FROM yt; 

SET @sql 
    = CONCAT('SELECT year, ', @sql, ' 
      from yt 
      group by year'); 

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

SQL Fiddle with Demo。這兩種結果:

| YEAR | GAS | DIESEL | LPN | 
----------------------------- 
| 2007 | 1 |  1 | 0 | 
| 2009 | 0 |  0 | 1 |