2013-06-12 56 views
1

我想製作圖表,這是我的表格;來自多個年份的計數數據和按月份分組

mrp 
+------------+ 
| date  | 
+------------+ 
| 2011-10-xx | 
| 2011-12-xx | 
| 2012-01-xx | 
| 2012-05-xx | 
| 2013-01-xx | 
| 2013-02-xx | 
+------------+ 

我想指望通過一個月近3年的數據,組,這裏就是我想實現的;

+--------+--------+--------+--------+ 
| quarty | 2011 | 2012 | 2013 | 
+--------+--------+--------+--------+ 
|jan-mar | 0  | 1  | 2  | 
|apr-jun | 0  | 1  | 0  | 
|jul-sept| 0  | 0  | 0  | 
|oct-dec | 2  | 0  | 0  | 
+--------+--------+--------+--------+ 

我試過了;

select case when month(date) between 1 and 3 then 'Jan-Mar' 
when month(date) between 4 and 6 then 'Apr-Jun' 
when month(date) between 7 and 9 then 'Jul-Sept' 
else 'Oct-Dec' end 'quarty', 
SUM(year(date) = 2011) AS `2011`, 
SUM(year(date) = 2012) AS `2012`, 
SUM(year(date) = 2013) AS `2013` 
from `mrp` where year(date) >= 2011 
group by 'quarty' 

但不知何故,只顯示'十月至十二月' 在2011年,2012年和2013年;有什麼辦法可以做到嗎?

注:我已經找到另一個查詢如何顯示所有月份僅在一年,我不能正確地排序,它顯示四月至六月,再一月至三月,七月至九月和oct-dec,我該如何正確分類?

回答

0

你可以採取QUARTER功能的優勢,做的工作適合你。

SELECT CASE WHEN QUARTER(`date`) = 1 THEN 'Jan-Mar' 
      WHEN QUARTER(`date`) = 2 THEN 'Apr-Jun' 
      WHEN QUARTER(`date`) = 3 THEN 'Jul-Sep' 
      WHEN QUARTER(`date`) = 4 THEN 'Oct-Dec' 
     END AS `Quarty`, 
     SUM(year(`date`) = 2011) AS `2011`, 
     SUM(year(`date`) = 2012) AS `2012`, 
     SUM(year(`date`) = 2013) AS `2013` 
FROM `mrp` 
WHERE year(`date`) >= 2011 
GROUP BY QUARTER(`date`) 

Live Sample

+0

太感謝你了!使用四分之一函數是非常有用的 – Darjeeling

0

這僅僅是從2011年,但你可以從2012年和2013年由你自己添加表

select 
case 
    when monthvalue=1 then 'Jan-Mar' 
    when monthvalue=2 then 'Apr-Jun' 
    when monthvalue=3 then 'Jul-Sep' 
    when monthvalue=4 then 'Oct-Dec' 
end as period, 
t2011.x as freq2011 from 
(SELECT CEIL(MONTH(date)/3) as monthVALUE,count(*) as x 
FROM mrp 
where year(date)=2011 
GROUP BY monthVALUE) t2011;