2017-06-02 280 views
1

我有一个包含25个日期列的表。现在我正在用PHP构建一个应用程序,并且必须显示基于月和年的摘要。我已经提到了下面的源表格布局和预期的汇总表。MySQL中按年份和月份分组

这里ID代表每一行。源表ID将在汇总表中使用。汇总表将每年创建一次。我需要一些帮助来准备这个汇总表。在这里我想提一提,我将在源桌上有大约30K行。

源表:

ID | DATE 1  | DATE 2  | DATE 3 
-------------------------------------------------- 
1 | 2017-01-14 | 2017-01-19 | 2017-01-25 
2 |    | 2017-03-19 | 2017-03-25 
3 | 2017-03-15 |    | 2017-05-25 
4 | 2017-04-24 | 2017-05-19 | 
5 | 2017-04-10 | 2017-06-19 | 2017-07-25 
6 | 2017-05-11 | 2017-06-19 | 2017-08-25 

汇总表

ID | YEAR | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC 
------------------------------------------------------------------------------------ 
1 | 2017 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 
2 | 2017 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 
3 | 2017 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 
4 | 2017 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 
5 | 2017 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 
6 | 2017 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 
+3

你的意思是你的表有25个不同的日期列? –

+0

我无法看到您想要做的事情的问题和尝试。你在那里有什么看起来效率不高。 –

+0

你想要在总结表中找到什么?每月发生的次数?为什么是2017年的所有行? –

回答

2

您需要unpivot的数据,并重新聚集它。查询结构为:

select id, year(date) as yyyy, 
     sum(month(date) = 1) as Jan, 
     sum(month(date) = 2) as Feb, 
     . . . 
     sum(month(date) = 12) as Dec 
from ((select id, date1 as date from source) union all 
     (select id, date2 as date from source) union all 
     . . . 
     (select id, date25 as date from source) 
    ) d 
where date is not null 
group by id, year(date) 
order by id, year(date); 

. . .表示填写空格。

+1

你先生,比“白色闪电”快。 –

+0

@ gordon-linoff它适用于我的情况。谢谢。 – nasirkhan