Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL oder PHP Wandeln Sie Zeilen in Spalten um

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.