一尘不染

将列值设置为SQL查询结果中的列名

mysql

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

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

如果看到id =
0,则name的值为ax,name2为bx,name3为cx。将行显示为id,name,name2,name3而不是行。现在,我希望查询结果看起来像这样:

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

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


阅读 1713

收藏
2020-05-17

共1个答案

一尘不染

这是通过 数据透视表完成的 。按分组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

这是一个工作样本

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

2020-05-17