[英]Setting column values as column names in the SQL query result
我想读取一个表,该表的值将是 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
有人可以帮助我实现这一目标吗?
这是通过数据透视表完成的。 按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 语句。
您尝试做的是PIVOT
MySQL 没有PIVOT
函数,因此您可以使用CASE
和聚合函数复制它。
如果您有已知数量的列,那么您可以使用静态版本并对值进行硬编码。 与此类似(请参阅SQL Fiddle with demo ):
select id,
max(case when col1='name' then col2 end) name,
max(case when col1='name2' then col2 end) name2,
max(case when col1='name3' then col2 end) name3
from yourtable
group by id
但是如果您有未知数量的列,那么您可以使用准备好的语句并动态创建它:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when col1 = ''',
col1,
''' then col2 end) AS ',
col1
)
) INTO @sql
FROM yourtable;
SET @sql = CONCAT('SELECT id, ', @sql, '
FROM yourtable
GROUP BY id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
select id,
max(if(tablename.columnname = 'name',tablename.columnname,null)) as namealise,
max(if(tablename.columnname = 'name1',tablename.columnname,null)) as namealise1
from table1, table2
where table1.id = table2.id
group by table1.id
order by table1.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.