Mysql 数据库行需要在列中显示

Mysql 数据库行需要在列中显示,mysql,pivot,Mysql,Pivot,我有以下数据库表: id Creation_Date Goals Alternative Value ----------------------------------------------------------- 1 2014-04-17 10:09:30 G1 A 0.86 2 2014-04-17 10:09:30 G1 B 0.87 3 2

我有以下数据库表:

id       Creation_Date         Goals  Alternative    Value
-----------------------------------------------------------
1   2014-04-17 10:09:30         G1         A         0.86
2   2014-04-17 10:09:30         G1         B         0.87
3   2014-04-17 10:09:30         G2         A         0.5
4   2014-04-17 10:09:30         G2         B         0
我的问题如下:

  select 
    alternative,
    max( case when goals='G1' then round( value, 2 ) end ) as 'G1',
    max( case when goals='G2' then round( value, 2 ) end ) as 'G2'
    from sgwebdb.dim_module
  group by alternative
  ;
并获得以下输出:

 Alternative    G1       G2
-----------------------------
 A            0.86      0.50    
 B            0.87      0.00

现在目标不是预先定义的G1、G2、G3、G4,…,它可以是任何数字。我可以有一个查询,这样我就可以得到相同的输出,而不必在查询中定义许多目标吗?

Pivot是您想要的,但MySQL显然不支持。随附的另一篇文章展示了如何实现这一点:


类似的方法可能会奏效:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(goals = ''',
      goals,
      ''', round(value, 2), NULL)) AS ',
      goals
    )
  ) INTO @sql
FROM sgwebdb.dim_module;
SET @sql = CONCAT('SELECT alternative, ', @sql, ' FROM sgwebdb.dim_module GROUP BY alternative');

prepare stmt from @sql;
execute stmt;
资料来源:


SQL FIDLE:

我认为您可能需要使用动态SQL当您不确定pivot查询将生成的动态列的数量及其名称时,您最好依靠一个带有prepared语句的存储过程来构造SQL语句并执行。所以你们可以得到动态识别列名和值的结果。Bobby-我从来并没有使用过动态sql。你们能帮我做这个查询吗?@Ravinder mate在你们的帮助下,我解决了上面的问题,但现在我在同一个查询中遇到了这个新问题。我从来并没有用过c的存储过程。@vim:Ok。下面的答案中有一个@Uriel_SVKmate提供的有效解决方案。这个解决方案在MySQL中运行良好,但唯一的问题是我从未在c代码中使用过MySQL过程。您可以将其设置为存储过程并从c轻松调用,解决方案取决于您对连接实体的使用?SQL客户端?在谷歌上有很多这样的例子。如果它不起作用,请将问题添加到您的问题中,或者生成新问题。如果没有过程,我们无法获得输出,我的意思是说,借助于单个查询?如果您有一个存储过程,您可以在单个查询中调用它。否则不知道。。自从我上次使用sql connector以来已经有好几年了