使用月份名称代替数字,在联合中选择mysql

时间:2018-10-06 22:48:07

标签: mysql

首先,我只是使用工会,但我不太了解。 基本上,要更改我通常使用的月份的名称

select MONTHNAME (date) 

但是在这种情况下,我对联盟的了解不深,因此将月份数更改为月份名称非常令人困惑。你能帮助我吗?请不仅给出答案,还请提供解释。

这是我的查询,而该查询得到了上一主题中的“粘滞位”帮助。

SELECT m.month month_table,
       coalesce(s.count, 0) cstart,
       coalesce(e.count, 0) cend
       FROM (SELECT 1 month
             UNION ALL
             SELECT 2 month
             UNION ALL
             SELECT 3 month
             UNION ALL
             SELECT 4 month
             UNION ALL
             SELECT 5 month
             UNION ALL
             SELECT 6 month
             UNION ALL
             SELECT 7 month
             UNION ALL
             SELECT 8 month
             UNION ALL
             SELECT 9 month
             UNION ALL
             SELECT 10 month
             UNION ALL
             SELECT 11 month
             UNION ALL
             SELECT 12 month) m
            LEFT JOIN (SELECT month(n.start_date) month,
                              count(*) count
                              FROM newdata n
                              GROUP BY month(n.start_date)) s
                      ON s.month = m.month
            LEFT JOIN (SELECT month(n.end_date) month,
                              count(*) count
                              FROM newdata n
                              GROUP BY month(n.end_date)) e
                      ON e.month = m.month
       ORDER BY m.month;

我尝试将所有“ month”替换为“ monthname”,但结果为0。

在将月份更改为月份名称之前

 month_table|cstart|cend
      1      |  1   |  0
      2      |  0   |  1
      3      |  0   |  0
      4      |  0   |  0
      5      |  0   |  0
      6      |  0   |  0
      7      |  0   |  0
      8      |  1   |  0
      9      |  0   |  0
      10     |  1   |  2
      11     |  0   |  0
      12     |  0   |  0

当我将月份更改为月份名称时,结果将为

month_table|cstart|cend
      1      |  0   |  0
      2      |  0   |  0
      3      |  0   |  0
      4      |  0   |  0
      5      |  0   |  0
      6      |  0   |  0
      7      |  0   |  0
      8      |  0   |  0
      9      |  0   |  0
      10     |  0   |  0
      11     |  0   |  0
      12     |  0   |  0

2 个答案:

答案 0 :(得分:1)

您可以只使用CONCAT将月份号转换为日期字符串,然后将其传递给MONTHNAME,即,将查询的第一行更改为:

SELECT MONTHNAME(CONCAT('2018-', m.month, '-01')) month_table,

输出(用于来自previous question的示例数据):

month_table     cstart  cend
January         1       0
February        0       1
March           0       0
April           0       0
May             0       0
June            0       0
July            0       0
August          1       0
September       0       0
October         1       2
November        0       0
December        0       0

SQLFiddle demo

答案 1 :(得分:0)

大多数人只是为这种事情创建查找表,填充一次然后使用它。它不仅性能大大提高,而且易于理解和重复使用。

另一种常见的打勾方式是创建一个“日历”表,其中包含十年左右的所有日期,日期名称,公众假期指标等,这使得编写查询以输出每天的数据,即使有那天没有数据,超级容易。而且它是完全可移植的。

忘记SQL功夫并应用KISS。