Wenn Sie auch separate Spalten für Ihre Jahre haben möchten, müssen Sie das Jahr hinzufügen (berechnet aus Ihrer Spalte date
) zu Ihrem dynamischen SQL-Code:
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
Die Spalten werden wie folgt benannt:January_2017
, und ich habe ein order by date
hinzugefügt , sonst wären sie normalerweise ungeordnet.
Ich habe eine group by r.region
hinzugefügt , sonst funktioniert es nicht, wenn only_full_group_by
auf Ihrem Server aktiviert ist (was ab MySQL 5.7 der Standardwert ist).
Und ich habe einen Test für leere Tabellen hinzugefügt (was sonst zu einem Fehler führen würde). Wenn Sie es nicht brauchen und nur Teile meines Codes in Ihren kopieren, achten Sie auf das fehlende Komma nach r.region
in SET @sql = CONCAT('SELECT r.account, r.region '
Im Vergleich zu Ihrem Code müssen Sie ihn möglicherweise erneut hinzufügen.
Da der Code für jeden Monat eine Länge von etwa 80 hat, müssen Sie möglicherweise group_concat_max_len
erhöhen um Ihre größtmögliche Suchanfrage zu erfüllen.