MySQL или PHP Преобразование строк в столбцы

У меня такая таблица:

введите описание изображения здесь

месяц динамически генерируется на основе пользовательского ввода. Месяц также можно повторить. Тем не менее, я хочу перенести значения месяца в столбцы со значением суммы, но при динамическом тестировании в mysql это не позволяет мне, потому что он может возвращать только отдельные значения.

Я также попытался удалить отличный от моего кода ниже, но он не работает. Есть предположения?

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, ''', amount, NULL)) AS ', month ) ) INTO @sql FROM tmp_results; SET @sql = CONCAT('SELECT r.account, r.region, ', @sql, ' FROM tmp_results r LEFT JOIN accounts AS a on r.account_id = a.id GROUP BY r.account'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END 

Пытался использовать коллекцию в laravel 5 и до сих пор ничего не делает. Если у вас есть ответ на 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 чтобы он соответствовал вашему самому большому возможному запросу.