我正在尝试编写一个跟踪一个月跨度的事件的查询,该月的每一天都是结果的列。尝试在每月的每一天使用group_concat时,仅返回第一次出现的日期。我已经包含了下面我正在使用的2个表的模式和数据,以及我期望看到的结果和我尝试过的SQL查询。
注意:我已经尽可能地简化了数据和架构,以找到问题的根源。
跟踪
tracking_id | date
_______________________________________
1 | 2017-05-01
2 | 2017-05-02
TrackingStatus
trackingstatus_id | tracking_id | time
___________________________________________
1 | 1 | 09:00
2 | 2 | 10:00
3 | 2 | 14:00
期望的结果
Month | Day1 | Day2
5 | 09:00 | 10:00,14:00
我尝试了以下查询
SELECT
MONTH(date),
if( date = '2017-05-01', group_concat(timeadministered), NULL ),
if( date = '2017-05-02', group_concat(timeadministered), NULL )
FROM trackingstatus ts
JOIN tracking t ON t.tracking_id = ts.tracking_id
GROUP BY MONTH(date)
但我得到以下结果
Month | Day1 | Day2
5 | 09:00,10:00,14:00 |
我知道当我在日期使用group by时,只有第一个日期值被行识别。有没有更好的方法来使用group by和group_concat?
答案 0 :(得分:0)
您可能希望聚合函数围绕 SELECT列表中的表达式。但是在GROUP_CONCAT周围包装另一个聚合并没有多大意义,因为GROUP BY子句中的表达式意味着每个月只会返回一行。
也许你想要这样的东西:
SELECT MONTH(t.date)
, GROUP_CONCAT(IF(t.date = '2017-05-01',t.timeadministered,NULL)) AS Day01
, GROUP_CONCAT(IF(t.date = '2017-05-02',t.timeadministered,NULL)) AS Day02
FROM ...
GROUP BY MONTH(t.date)