SQL将列标题转换为行

时间:2015-09-22 02:23:20

标签: 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% |
+---------+-------+-----------+-----+

标题行中的数字实际上是年份,我想将它们聚合到“年龄”列中。

+---------+-------+-----+------------+
| Vehicle |  Kms  | Age | Percentage |
------------------------+------------+
|  Car    | 30000 | 6   |   53%      |
|  Car    | 30000 | 12  |   50%      |
|  Car    | 30000 | 12  |   47%      |
|  Car    | 40000 | 6   |   50%      |
+---------+-------+-----+------------+

我已经研究过使用PIVOT,但我不想聚合Kms列。 知道如何实现这个目标吗?

2 个答案:

答案 0 :(得分:2)

我建议的方法是joincase的组合,您可以在其中加入数据透视表,然后使用大小写来选择所需的值。

不同的数据库可能有其他更高效的非ANSI解决方案,因此如果知道您正在使用哪个数据库以及您是否希望坚持使用纯ANSI以实现可移植性或为您的平台进行最佳调整,那么

加入的两个选择:

  1. 提供内联联接表:

    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小提琴here

  2. 首先构建连接表,然后加入它:

    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小提琴here

  3. 随着数据透视表的大小增长,第二种方法可以让你的查询合理地保持一致。

答案 1 :(得分:0)

一种方法是使用union all

select vehicle, kms, '6' as age, `6` as percentage from table t
union all
select vehicle, kms, '12' as age, `12` as percentage from table t
union all
select vehicle, kms, '18' as age, `18` as percentage from table t;

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

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

相关问题