【问题标题】:SQL - Make a custom table with month based columns and year based rowsSQL - 使用基于月份的列和基于年份的行创建自定义表
【发布时间】:2013-07-29 15:55:04
【问题描述】:

我正在尝试制作一个很棒的自定义表格,它计算行数并组织它们,以便如果有 3 行日期在 2013 年 1 月,4 行在 2014 年 3 月,5 行在 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

【问题讨论】:

  • 我不知道您想要实现什么,但我怀疑表格设计是否是最佳实践。

标签: mysql sql customcolumn


【解决方案1】:

我建议使用视图而不是新表,这样当您的基础数据发生更改时,您的新表不会不同步。

由于您没有提供太多示例数据,我不得不假设一个结构,但您会想要这样的东西:

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`);

Example on SQL Fiddle

【讨论】:

  • 我不确定是否会显示 0 条记录的月份。我会使用 sum(case etc then 1 else 0 end) 而不是 count。
  • @DanBracuk 没有区别(检查小提琴,它的显示与问题中的说明完全相同),两种方法的工作原理完全相同,只是个人喜好。我个人认为当你想要 COUNT 时使用 COUNT 更有意义,当你想要 SUM 时使用 SUM
  • 更多关于COUNT(CASE...) vs SUM(CASE ...)`dba.stackexchange.com/q/27558/7257
  • 抱歉我的无知,但请你解释一下这是如何工作的,因为我一无所知
  • 一旦你创建了一次视图,你可以参考它,它总是在你建议的布局中。如果您发布您的实际表结构,我可以尝试将其从一个通用示例调整为更适合您需求的内容。
猜你喜欢
  • 2017-11-16
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多