简体   繁体   English

如何连接日期并在日期月份下检索

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM