2011-07-28 127 views
3

我的MySQL数据库具有以下列标题:MySQL查询和数据透视表

month, typeOfWork, totalHours 

我感兴趣根据typeOfWork和月份显示的结果。例如,所有typeOfWork条目将显示在左侧的第一列中,每个字段将在每个列的指定月份中累计该特定的TypeOfWork。因此,我的SQL数据透视表语句是目前:

SELECT 
IFNULL(typeOfWork, 'Total') AS TypeOfWork, 
SUM(IF(month='JAN',totalHours,NULL)) AS JAN,  
SUM(IF(month='FEB',totalHours,NULL)) AS FEB,  
SUM(IF(month='MAR',totalHours,NULL)) AS MAR,  
SUM(IF(month='APR',totalHours,NULL)) AS APR,  
SUM(IF(month='MAY',totalHours,NULL)) AS MAY,  
SUM(IF(month='JUN',totalHours,NULL)) AS JUN,  
SUM(IF(month='JUL',totalHours,NULL)) AS JUL,  
SUM(IF(month='AUG',totalHours,NULL)) AS AUG, 
SUM(IF(month='SEP',totalHours,NULL)) AS SEP,  
SUM(IF(month='OCT',totalHours,NULL)) AS OCT,  
SUM(IF(month='NOV',totalHours,NULL)) AS NOV,  
SUM(IF(month='DEC',totalHours,NULL)) AS DEC 

FROM $databasetable GROUP BY typeOfWork 
WITH ROLLUP 

我目前得到一个语法错误,指定的最后一行(从“DEC通过对ROLLUP”)。我的困惑来自于这样一个事实,即我简单地从脚本中的另一个工作数据透视表中调整了此表。我认为这种差异可能出现在我的两个要求中(总和为小时,其中月份等于列名,AND typeOfWork等于第一列中的typeOfWork)。我想知道我的IF语句是否需要AND子句?

任何人都可以用这个数据透视表指向正确的方向吗?这将不胜感激。谢谢!

回答

5

您的查询是正确的。 只有一样东西 - DEC是MySQL reserved word,这个单词不能直接用作对象标识符;所以,只是引用反引号 -

SELECT 
IFNULL(typeOfWork, 'Total') AS TypeOfWork, 
SUM(IF(month='JAN',totalHours,NULL)) AS JAN,  
... 
SUM(IF(month='DEC',totalHours,NULL)) AS `DEC` 

FROM $databasetable GROUP BY typeOfWork 
+0

你是我的英雄。这个窍门!我从来不会猜到,非常感谢。 :) – Andrew