首先,我只是使用工会,但我不太了解。 基本上,要更改我通常使用的月份的名称
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
答案 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
答案 1 :(得分:0)
大多数人只是为这种事情创建查找表,填充一次然后使用它。它不仅性能大大提高,而且易于理解和重复使用。
另一种常见的打勾方式是创建一个“日历”表,其中包含十年左右的所有日期,日期名称,公众假期指标等,这使得编写查询以输出每天的数据,即使有那天没有数据,超级容易。而且它是完全可移植的。
忘记SQL功夫并应用KISS。