Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL或PHP将行转换为列_Php_Mysql_Laravel 5.2 - Fatal编程技术网

MySQL或PHP将行转换为列

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

我有这样的桌子:

根据用户输入动态生成月份。这个月也可以重复。但是,我想将月份值转换为amount值的列,但在mysql中动态尝试时,它不允许我这样做,因为它只能返回不同的值

我还尝试从下面的代码中删除distinct,但它不起作用。有什么想法吗

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,我有一个新的专栏,这些都是数量,但标签不同。我如何用你提供的答案实现它?