Hvis du også vil have separate kolonner for dine årstal, skal du tilføje året (beregnet ud fra din kolonne date
) til din dynamiske sql-kode:
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
Kolonnerne vil blive navngivet som January_2017
, og jeg tilføjede en order by date
, ellers ville de normalt være uordnede.
Jeg tilføjede en group by r.region
, ellers vil det ikke fungere, hvis only_full_group_by
er aktiveret på din server (som er standardværdien, der starter med MySQL 5.7).
Og jeg tilføjede en test for tomme tabeller (som ellers ville resultere i en fejl). Hvis du ikke har brug for det og kun kopierer dele af min kode til din, skal du være opmærksom på det manglende komma efter r.region
i SET @sql = CONCAT('SELECT r.account, r.region '
sammenlignet med din kode, skal du muligvis tilføje den igen.
Da koden for hver måned har en længde på omkring 80, skal du muligvis øge group_concat_max_len
for at passe til din størst mulige forespørgsel.