我对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列。 知道如何实现这个目标吗?
答案 0 :(得分:2)
我建议的方法是join
和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小提琴here
首先构建连接表,然后加入它:
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
随着数据透视表的大小增长,第二种方法可以让你的查询合理地保持一致。
答案 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
子句。