sql >> Databáze >  >> RDS >> Mysql

MySQL nebo PHP Transformujte řádky na sloupce

Pokud chcete mít samostatné sloupce i pro vaše roky, musíte přidat rok (vypočtený z vašeho sloupce date ) do vašeho dynamického kódu SQL:

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

Sloupce budou pojmenovány jako January_2017 a přidal jsem order by date , jinak by byly většinou neuspořádané.

Přidal jsem group by r.region , jinak to nebude fungovat, pokud only_full_group_by je na vašem serveru povoleno (což je výchozí hodnota počínaje MySQL 5.7).

A přidal jsem test na prázdné tabulky (což by jinak vedlo k chybě). Pokud jej nepotřebujete a do svého zkopírujete pouze části mého kódu, dejte pozor na chybějící čárku za r.region v SET @sql = CONCAT('SELECT r.account, r.region ' v porovnání s vaším kódem jej možná budete muset přidat znovu.

Protože kód pro každý měsíc má délku přibližně 80, možná budete muset zvýšit group_concat_max_len aby se vešly na váš největší možný dotaz.




  1. Pokud MYSQL nerozlišuje malá a velká písmena, Jak to funguje pro pole Heslo v Přihlášení?

  2. Načíst funkce pole zdvojnásobení hodnot na každé pozici pole?

  3. Zachycování varování MySQL v Pythonu

  4. SQL rekurzivní dotaz na samoodkazovací tabulku (Oracle)