MySQL或PHP将行转换为列
我有这样的桌子: 根据用户输入动态生成月份。这个月也可以重复。但是,我想将月份值转换为amount值的列,但在mysql中动态尝试时,它不允许我这样做,因为它只能返回不同的值 我还尝试从下面的代码中删除distinct,但它不起作用。有什么想法吗MySQL或PHP将行转换为列,php,mysql,laravel-5.2,Php,Mysql,Laravel 5.2,我有这样的桌子: 根据用户输入动态生成月份。这个月也可以重复。但是,我想将月份值转换为amount值的列,但在mysql中动态尝试时,它不允许我这样做,因为它只能返回不同的值 我还尝试从下面的代码中删除distinct,但它不起作用。有什么想法吗 CREATE DEFINER=`root`@`localhost` PROCEDURE `test`() BEGIN SET group_concat_max_len=2048; SET @sql = NULL; SELECT GROUP_CO
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
尝试在Laravel5中使用该集合,但仍然一无所获,如果您有php的答案,我也很欢迎。为了解决这个问题,我绞尽脑汁了好几天。如果您想为您的年份设置单独的列,您必须将年份(从列
日期计算)添加到动态sql代码中:
CREATE DEFINER=`root`@`localhost`过程`test`()
开始
设置组浓度最大长度=2048;
设置@sql=NULL;
选择组_CONCAT(不同的CONCAT(
'最大值(如果(月=''),
月,
“和年份(日期)=”,
年份(日期),
,amount,NULL)作为“,”,
月,
'_',
年份(日期),
'`'
)
按日期订购
)进入@sql
根据tmp_结果;
如果合并(@sql,,)!=''然后
设置@sql=concat(“,”,@sql);
如果结束;
SET@sql=CONCAT(
'选择r.account,
r、 区域',
合并(@sql',),
'来自tmp_结果r
左键将帐户作为
按r.account_id=a.id
按r.账户、r.地区分组’;
从@sql准备stmt;
执行stmt;
解除分配准备stmt;
结束
这些列的名称将类似于2017年1月
,我添加了一个按日期排序的,否则它们通常是无序的
我添加了一个groupby r.region
,否则,如果服务器上只启用了的
(这是从MySQL 5.7开始的默认值)
我还为空表添加了一个测试(否则会导致错误)。如果您不需要它,并且只将我的部分代码复制到您的代码中,请注意SET@sql=CONCAT('SELECT r.account,r.region'
中r.region
后缺少的逗号。与您的代码相比,您可能需要再次添加它
由于每个月的代码长度约为80,您可能需要增加组concat\u max\u len
,以满足最大可能的查询。“不工作”不是很具体:什么不工作或出现什么错误?取决于您的服务器配置(例如5.7默认配置),您可能必须将r.region
更改为max(r.region)as region
,在中选择或使用按r.account分组,r.region
,否则,乍一看,代码看起来是正确的(除了不检查tmp_results
或者更确切地说@sql
是否为空之外,在这种情况下它会导致错误,但这似乎不是问题所在;如果月
的值无效,例如'
,或者包含空格,-
,…),它将不起作用。)。不起作用意味着,它没有返回我想要的结果。它省略了我需要显示的其他月份。它起作用了,只是没有返回我期望的结果。您可以添加通过该操作得到的结果(以及您想要得到的结果)吗?或者解释“省略其他月份”的含义?通过该查询和您的数据,您应该将所有12个月作为列(可能是随机顺序,但只要它们存在于基表中,它们都应该存在)是的,12个月,但是如果用户选择3年,它应该返回36个月,但这不是我的问题,你太好了!谢谢你,我解决了我的问题。现在我明白了。首先你把一年和一个月的一个字符串,所以它不会被认为是重复的值。嗨,我有问题,放在哪里陈述和我的参数应该是STR。ing,这部分:设置@sql=CONCAT('SELECT r.account as account,r.region as region,SUM(r.amount)as Total',coalesce(@sql',),'FROM tmp_结果,r LEFT JOIN accounts as a on r.account_id=a.id,其中a.ABE=',person,'GROUP BY r.account,r.region ORDER BY r.account_id');@Dhenn是您的“person”一个变量?然后你必须用'
将其包围起来,类似于你之前的月份-变量(它有一列,但工作方式相同)。因此请尝试…其中a.ABE='',person','groupby…
(三个单独的。
)Helo,我有一个新的专栏,这些都是数量,但标签不同。我如何用你提供的答案实现它?