[英]how to concat dates and retrieve under month of dates
I am using holiday table as:我使用假期表作为:
I want to retrive 1 row having columns Jan To Dec and data as all holidays in respective month.我想检索具有 Jan 到 Dec 列和数据的 1 行作为相应月份的所有假期。 I tried with我试过
SELECT
(CASE WHEN MONTH(hd.holiday_date)=1 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as JAN,
(CASE WHEN MONTH(hd.holiday_date)=2 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as FEB,
(CASE WHEN MONTH(hd.holiday_date)=3 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as MAR,
(CASE WHEN MONTH(hd.holiday_date)=4 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as APR,
(CASE WHEN MONTH(hd.holiday_date)=5 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as MAY,
(CASE WHEN MONTH(hd.holiday_date)=6 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as JUN,
(CASE WHEN MONTH(hd.holiday_date)=7 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as JUL,
(CASE WHEN MONTH(hd.holiday_date)=8 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as AUG,
(CASE WHEN MONTH(hd.holiday_date)=9 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as SEP,
(CASE WHEN MONTH(hd.holiday_date)=10 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as OCT,
(CASE WHEN MONTH(hd.holiday_date)=11 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as NOV,
(CASE WHEN MONTH(hd.holiday_date)=12 THEN GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) ELSE NULL END) as DECE
FROM `holiday` `hd`
WHERE `year` = '2020'
GROUP BY MONTH(hd.holiday_date)
with group by getting result but multiple rows are returing as与组通过获取结果但多行返回为
without group by returning single row but not getting under proper month as没有通过返回单行但没有进入适当的月份而没有分组
Please suggest me correct way.请建议我正确的方法。 Thanks.谢谢。
1) Create inner query where group them by months 1)创建内部查询,按月对它们进行分组
SELECT
MONTH(hd.holiday_date) as m,
GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) as name
FROM holiday as hd
GROUP BY MONTH(hd.holiday_date)
2) In outer query do something like 2)在外部查询中做类似的事情
SELECT
MAX(case when m = 1 then name else "" end) as Jan
MAX(case when m = 2 then name else "" end) as Feb
FROM (inner)
So the result will be所以结果将是
SELECT
MAX(case when m = 1 then name else "" end) as Jan,
MAX(case when m = 2 then name else "" end) as Feb
// etc
FROM (
SELECT
MONTH(hd.holiday_date) as m,
GROUP_CONCAT(CONCAT(hd.holiday_date, '#', hd.holiday_name)) as name
FROM holiday as hd
GROUP BY MONTH(hd.holiday_date)
) as grouped
I think it's the other way around:我认为这是相反的:
SELECT GROUP_CONCAT(CASE WHEN MONTH(holiday_date)=3
THEN CONCAT_WS('#',holiday_date,holiday_name)
ELSE NULL END) AS 'March',
GROUP_CONCAT(CASE WHEN MONTH(holiday_date)=4
THEN CONCAT_WS('#',holiday_date,holiday_name)
ELSE NULL END) AS 'April'
FROM holiday
WHERE YEAR=2020
GROUP BY YEAR;
Fiddle example here: https://www.db-fiddle.com/f/2DUDuiGM4T12Ah7hxuPTdB/1小提琴示例: https : //www.db-fiddle.com/f/2DUDuiGM4T12Ah7hxuPTdB/1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.