У меня такая таблица:
месяц динамически генерируется на основе пользовательского ввода. Месяц также можно повторить. Тем не менее, я хочу перенести значения месяца в столбцы со значением суммы, но при динамическом тестировании в 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
чтобы он соответствовал вашему самому большому возможному запросу.