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以来已经有好几年了