Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL или PHP Преобразувайте редовете в колони

Ако искате да имате отделни колони и за вашите години, трябва да добавите годината (изчислена от вашата колона date ) към вашия динамичен 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

Колоните ще бъдат наречени като January_2017 , и добавих order by date , в противен случай те обикновено биха били неподредени.

Добавих group by r.region , в противен случай няма да работи, ако only_full_group_by е активиран на вашия сървър (което е стойността по подразбиране, започваща с MySQL 5.7).

И добавих тест за празни таблици (което иначе би довело до грешка). Ако не ви трябва и копирате само части от моя код във вашия, имайте предвид липсващата запетая след r.region в SET @sql = CONCAT('SELECT r.account, r.region ' в сравнение с вашия код, може да се наложи да го добавите отново.

Тъй като кодът за всеки месец има дължина от около 80, може да се наложи да увеличите group_concat_max_len за да отговаря на най-голямата ви възможна заявка.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-добри практики за съхраняване на информация за кредитна карта в базата данни

  2. Mysql, възможен проблем с вложена категория

  3. Моят sql SELECT израз JOIN на три таблици

  4. Мога ли да дефинирам множество събития в една декларация на Trigger в mysql?

  5. Как да конфигурирам Spring boot за работа с две бази данни?