mysql – 在SQL查询结果中将列值设置为列名

我想读一个表,其中的值将是sql查询结果的列名.
例如,我有table1作为..

id    col1     col2
----------------------
0      name    ax
0      name2   bx
0      name3   cx
1      name    dx
1      name2   ex
1      name2   fx

如果您看到id = 0,则name的值为ax,名称为2 – bx,name3 = cx
而不是这是行,更容易将列显示为id,name,name2,name3
现在我希望查询的结果看起来像这样

id   name    name2     name3
0    ax      bx         cx
1    dx      ex         fx

有人可以帮我实现这个目标吗?

解决方法:

这是通过数据透视表完成的.按id分组,为要在列中捕获的每个值发出CASE语句,并使用类似MAX()聚合的方法来消除空值并向下折叠到一行.

SELECT
  id,
  /* if col1 matches the name string of this CASE, return col2, otherwise return NULL */
  /* Then, the outer MAX() aggregate will eliminate all NULLs and collapse it down to one row per id */
  MAX(CASE WHEN (col1 = 'name') THEN col2 ELSE NULL END) AS name,
  MAX(CASE WHEN (col1 = 'name2') THEN col2 ELSE NULL END) AS name2,
  MAX(CASE WHEN (col1 = 'name3') THEN col2 ELSE NULL END) AS name3
FROM
  yourtable
GROUP BY id
ORDER BY id

Here’s a working sample

注意:这仅适用于col1的有限且已知数量的可能值.如果可能值的数量未知,则需要在循环中动态构建SQL语句.

上一篇:MySQL pivot row成动态列数


下一篇:SQL – 如何转置?