Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL o PHP Trasforma le righe in colonne

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.