Mysql SQL将列标题转换为行

Mysql SQL将列标题转换为行,mysql,sql,pivot,unpivot,Mysql,Sql,Pivot,Unpivot,我是SQL的新手,请原谅 我有一张这样的桌子: +---------+-------+-----+-----+-----+ | Vehicle | Kms | 6 | 12 | 18 | +---------+-------+-----------+-----+ | Car | 30000 | 53% | 50% | 47% | | Car | 40000 | 50% | 47% | 44% | | Bus | 50000 | 47% | 44% | 42%

我是SQL的新手,请原谅

我有一张这样的桌子:

+---------+-------+-----+-----+-----+
| Vehicle |  Kms  |  6  | 12  | 18  |
+---------+-------+-----------+-----+
|  Car    | 30000 | 53% | 50% | 47% |
|  Car    | 40000 | 50% | 47% | 44% |
|  Bus    | 50000 | 47% | 44% | 42% |
+---------+-------+-----------+-----+
标题行中的数字实际上是年,我想将它们聚合成一个“年龄”列,如下所示

+---------+-------+-----+------------+
| Vehicle |  Kms  | Age | Percentage |
------------------------+------------+
|  Car    | 30000 | 6   |   53%      |
|  Car    | 30000 | 12  |   50%      |
|  Car    | 30000 | 12  |   47%      |
|  Car    | 40000 | 6   |   50%      |
+---------+-------+-----+------------+
我已经研究过使用PIVOT,但我不想聚合Kms列。 你知道我如何做到这一点吗?

一种方法是使用union all

如果您有大数据,还有其他方法不需要三次表扫描,但这适用于中等数量的数据


如果您只想将其用于汽车,那么最有效的方法是为每个子查询使用where子句。

我建议的方法是将join和case结合使用,您可以将它们连接到透视表,然后使用case选择所需的值

不同的数据库可能有其他更有效的非ANSI解决方案,因此,如果知道您使用的是什么数据库,以及您是否希望坚持使用纯ANSI以实现可移植性,或者为您的平台进行优化调整,这将是一件好事

连接有两种选择:

以内联方式提供联接表:

SELECT `Vehicle`, `Age`, CASE when `Age` = 6 then `6` when `Age` = 12 then `12` when `Age` = 18 then `18` END as `Percent` FROM t1, (select 6 as `Age` union all select 12 as `Age` union all select 18 as `Age` ) as age_pivot; SQL小提琴

首先构造联接表,然后联接到它:

SELECT `Vehicle`, `Age`, CASE when `Age` = 6 then `6` when `Age` = 12 then `12` when `Age` = 18 then `18` END as `Percent` FROM t1, age_pivot; SQL小提琴

第二种方法很方便,可以随着数据透视表的增长合理地考虑查询

SELECT `Vehicle`, `Age`, CASE when `Age` = 6 then `6` when `Age` = 12 then `12` when `Age` = 18 then `18` END as `Percent` FROM t1, age_pivot;