Ако искате да имате отделни колони и за вашите години, трябва да добавите годината (изчислена от вашата колона date
) към вашия динамичен 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
Колоните ще бъдат наречени като January_2017
, и добавих order by date
, в противен случай те обикновено биха били неподредени.
Добавих group by r.region
, в противен случай няма да работи, ако only_full_group_by
е активиран на вашия сървър (което е стойността по подразбиране, започваща с MySQL 5.7).
И добавих тест за празни таблици (което иначе би довело до грешка). Ако не ви трябва и копирате само части от моя код във вашия, имайте предвид липсващата запетая след r.region
в SET @sql = CONCAT('SELECT r.account, r.region '
в сравнение с вашия код, може да се наложи да го добавите отново.
Тъй като кодът за всеки месец има дължина от около 80, може да се наложи да увеличите group_concat_max_len
за да отговаря на най-голямата ви възможна заявка.