Это странный запрос.Вы ищете независимые подсчеты двух местоположений, но выровненные в одной строке (это странно, потому что много повторяющихся данных).
Вы можете сделать это путем агрегирования до присоединения :
with l as (
select l.id, l.location, date_format(l.time, '%Y%m') as yyyymm,
count(*) as cnt
from carlocations l
group by l.id, l.location, date_format(l.time, '%Y%m')
)
select l1.id, l1.location as location1, l2.location2, l1.yyyymm, l1.cnt as cnt2, l2.cnt as cnt2
from l l1 join
l l2
on l1.id = l2.id and l1.yyyymm = l2.yyyymm and
l1.location < l2.location;
with
поддерживается в MySQL 8+.В более ранних версиях вам нужно было бы повторять подзапрос в предложении from
.
РЕДАКТИРОВАТЬ:
Без CTE это выглядит следующим образом:
select l1.id, l1.location as location1, l2.location2, l1.yyyymm, l1.cnt as cnt2, l2.cnt as cnt2
from (select l.id, l.location, date_format(l.time, '%Y%m') as yyyymm,
count(*) as cnt
from carlocations l
group by l.id, l.location, date_format(l.time, '%Y%m')
) l1 join
(select l.id, l.location, date_format(l.time, '%Y%m') as yyyymm,
count(*) as cnt
from carlocations l
group by l.id, l.location, date_format(l.time, '%Y%m')
) l2
on l1.id = l2.id and l1.yyyymm = l2.yyyymm and
l1.location < l2.location;