|
行转列
给出下面的数据:
CREATE TABLE Sales (Year INT, Quarter INT, Results INT)
YEAR QUARTER RESULTS----------- ----------- ----------- 2004 1 20 2004 2 30 2004 3 15 2004 4 10 2005 1 18 2005 2 40 2005 3 12 2005 4 27想要的到结果:YEAR Q1 Q2 Q3 Q4----------- ----------- ----------- ----------- ----------- 2004 20 30 15 10 2005 18 40 12 27这个SQL就可解决这个问题:SELECT Year, MAX(CASE WHEN Quarter = 1 THEN Results END) AS Q1, MAX(CASE WHEN Quarter = 2 THEN Results END) AS Q2, MAX(CASE WHEN Quarter = 3 THEN Results END) AS Q3, MAX(CASE WHEN Quarter = 4 THEN Results END) AS Q4FROM SalesGROUP BY Year解释一下为什么要加max的原因,因为不加max的话结果会是这样:YEAR Q1 Q2 Q3 Q4----------- ----------- ----------- ----------- ----------- 2004 20 - - - 2004 - 30 - - 2004 - - 15 - 2004 - - - 10 2005 18 - - - 2005 - 40 - - 2005 - - 12 - 2005 - - - 27列转行
给出下面数据
CREATE TABLE SalesAgg( year INTEGER, q1 INTEGER, q2 INTEGER, q3 INTEGER, q4 INTEGER );YEAR Q1 Q2 Q3 Q4----------- ----------- ----------- ----------- ----------- 2004 20 30 15 10 2005 18 40 12 27想要的结果YEAR QUARTER RESULTS----------- ----------- ----------- 2004 1 20 2004 2 30 2004 3 15 2004 4 10 2005 1 18 2005 2 40 2005 3 12 2005 4 27这个SQL就可以实现:
SELECT S.Year, Q.Quarter, Q.ResultsFROM SalesAgg AS S, TABLE (VALUES(1, S.q1), (2, S.q2), (3, S.q3), (4, S.q4)) AS Q(Quarter, Results);下面解释一下执行的过程:核心是用table函数创建了一个表,这个表是用value实现的多行表,value实现虚表的例子:db2 => select * from (values (1,2),(2,3)) as t1(col1,col2)COL1 COL2----------- ----------- 1 2 2 3 2 条记录已选择。db2 => select * from (values 1) as a
1
-----------
1
1 条记录已选择。
所不同的是这里跟from子句中的一个表产生了关系,取出了表中的一列作为数据 |
|
|