Se vuoi avere colonne separate anche per i tuoi anni, devi aggiungere l'anno (calcolato dalla tua colonna date
) al tuo codice sql dinamico:
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
Le colonne avranno un nome come January_2017
e ho aggiunto un order by date
, altrimenti di solito non sarebbero ordinati.
Ho aggiunto un group by r.region
, altrimenti non funzionerà se only_full_group_by
è abilitato sul tuo server (che è il valore predefinito a partire da MySQL 5.7).
E ho aggiunto un test per le tabelle vuote (che altrimenti risulterebbe in un errore). Se non ti serve e copia solo parti del mio codice nel tuo, fai attenzione alla virgola mancante dopo r.region
in SET @sql = CONCAT('SELECT r.account, r.region '
rispetto al tuo codice, potresti doverlo aggiungere di nuovo.
Poiché il codice per ogni mese ha una lunghezza di circa 80, potresti dover aumentare group_concat_max_len
per soddisfare la tua query più ampia possibile.