Mysql SQL-使用基于月的列和基于年的行创建自定义表
我正在尝试制作一个很棒的自定义表格,统计行数并组织它们,这样,如果有三行日期在2013年1月,四行日期在2014年3月,五行日期在2014年10月,该表格将显示为:Mysql SQL-使用基于月的列和基于年的行创建自定义表,mysql,sql,customcolumn,Mysql,Sql,Customcolumn,我正在尝试制作一个很棒的自定义表格,统计行数并组织它们,这样,如果有三行日期在2013年1月,四行日期在2014年3月,五行日期在2014年10月,该表格将显示为: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 2013 3 0 0 0 0 0 0 0 0 0 0 0 2014 0 0 4 0 0 0 0 0 0 5 0 0 我建议使用视图,而不是
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2013 3 0 0 0 0 0 0 0 0 0 0 0
2014 0 0 4 0 0 0 0 0 0 5 0 0
我建议使用视图,而不是新表,这样,当基础数据发生更改时,新表不会不同步 由于您没有给出太多的示例数据,我不得不假设一个结构,但您可能需要这样的内容:
CREATE TABLE T (`Date` DATETIME);
INSERT T (`Date`)
VALUES
('2013-01-01'), ('2013-01-02'), ('2013-01-03'),
('2014-03-01'), ('2014-03-02'), ('2014-03-03'),
('2014-10-01'), ('2014-10-01'), ('2014-10-01'),
('2014-10-01'), ('2014-10-01');
CREATE VIEW V
AS
SELECT YEAR(`Date`) AS `Year`,
COUNT(CASE WHEN MONTH(`Date`) = 1 THEN 1 END) AS `Jan`,
COUNT(CASE WHEN MONTH(`Date`) = 2 THEN 1 END) AS `Feb`,
COUNT(CASE WHEN MONTH(`Date`) = 3 THEN 1 END) AS `Mar`,
COUNT(CASE WHEN MONTH(`Date`) = 4 THEN 1 END) AS `Apr`,
COUNT(CASE WHEN MONTH(`Date`) = 5 THEN 1 END) AS `May`,
COUNT(CASE WHEN MONTH(`Date`) = 6 THEN 1 END) AS `Jun`,
COUNT(CASE WHEN MONTH(`Date`) = 7 THEN 1 END) AS `Jul`,
COUNT(CASE WHEN MONTH(`Date`) = 8 THEN 1 END) AS `Aug`,
COUNT(CASE WHEN MONTH(`Date`) = 9 THEN 1 END) AS `Sep`,
COUNT(CASE WHEN MONTH(`Date`) = 10 THEN 1 END) AS `Oct`,
COUNT(CASE WHEN MONTH(`Date`) = 11 THEN 1 END) AS `Nov`,
COUNT(CASE WHEN MONTH(`Date`) = 12 THEN 1 END) AS `Dec`
FROM T
GROUP BY YEAR(`Date`);
我不知道您想要实现什么,但我怀疑表格设计是否是最佳实践。我不确定是否会显示0条记录的月份。我会使用sum(case etc然后1 else 0 end)而不是count。@DanBracuk它没有区别(检查小提琴,它的显示与问题中的显示完全相同),这两种方法的工作原理完全相同,只是个人喜好。我个人认为当你想要一个
COUNT
时使用COUNT
,当你想要一个SUM时使用SUM
更有意义。有关COUNT(CASE…
vs SUM(CASE…)的更多信息,请原谅我的无知,但请你解释一下这是如何工作的,因为我很高兴你创建了一次视图,您只需参考它,它将始终位于您建议的布局中。如果您发布实际的表结构,我可以尝试将其从一个通用示例修改为更适合您需要的内容。