Jeśli chcesz mieć oddzielne kolumny dla swoich lat, musisz dodać rok (obliczony na podstawie kolumny date
) do Twojego dynamicznego kodu sql:
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`()
BEGIN
SET group_concat_max_len=2048;
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT(
'MAX(IF(month = ''',
month,
''' and year(date) = ',
year(date),
', amount, NULL)) AS `',
month,
'_',
year(date),
'`'
)
order by date
) INTO @sql
FROM tmp_results;
if coalesce(@sql,'') != '' then
set @sql = concat(', ', @sql);
end if;
SET @sql = CONCAT(
'SELECT r.account,
r.region ',
coalesce(@sql,''),
' FROM tmp_results r
LEFT JOIN accounts AS a
on r.account_id = a.id
GROUP BY r.account, r.region');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
Kolumny zostaną nazwane tak jak January_2017
i dodałem order by date
, w przeciwnym razie byłyby zwykle nieuporządkowane.
Dodałem group by r.region
, w przeciwnym razie nie zadziała, jeśli only_full_group_by
jest włączona na twoim serwerze (co jest wartością domyślną, począwszy od MySQL 5.7).
I dodałem test dla pustych tabel (co w przeciwnym razie spowodowałoby błąd). Jeśli go nie potrzebujesz i skopiuj tylko część mojego kodu do swojego, pamiętaj o braku przecinka po r.region
w SET @sql = CONCAT('SELECT r.account, r.region '
w porównaniu z kodem, może być konieczne dodanie go ponownie.
Ponieważ kod na każdy miesiąc ma długość około 80, może być konieczne zwiększenie group_concat_max_len
pasujące do Twojego największego możliwego zapytania.