Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL lub PHP Przekształć wiersze w kolumny

Jeśli chcesz mieć oddzielne kolumny dla swoich lat, musisz dodać rok (obliczony na podstawie kolumny date ) do Twojego dynamicznego kodu 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

Kolumny zostaną nazwane tak jak January_2017 i dodałem order by date , w przeciwnym razie byłyby zwykle nieuporządkowane.

Dodałem group by r.region , w przeciwnym razie nie zadziała, jeśli only_full_group_by jest włączona na twoim serwerze (co jest wartością domyślną, począwszy od MySQL 5.7).

I dodałem test dla pustych tabel (co w przeciwnym razie spowodowałoby błąd). Jeśli go nie potrzebujesz i skopiuj tylko część mojego kodu do swojego, pamiętaj o braku przecinka po r.region w SET @sql = CONCAT('SELECT r.account, r.region ' w porównaniu z kodem, może być konieczne dodanie go ponownie.

Ponieważ kod na każdy miesiąc ma długość około 80, może być konieczne zwiększenie group_concat_max_len pasujące do Twojego największego możliwego zapytania.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ręczne odszyfrowywanie Ebeana

  2. Zatrzymaj ponowne używanie przez MySQL identyfikatorów AUTO_INCREMENT

  3. Jak przywrócić pojedynczą tabelę MySQL za pomocą mysqldump?

  4. Ta witryna jest niedostępna po przeniesieniu witryny Wordpress

  5. Liczba elementów MySQL w klauzuli