Sql 转换查询输出
我有一个正常的select查询,它会在输出之后产生结果Sql 转换查询输出,sql,oracle11g,transpose,Sql,Oracle11g,Transpose,我有一个正常的select查询,它会在输出之后产生结果 select cid,x1,x2,x3,x4,fy from temp_table; cid x1 x2 x3 x4 fy ---------------------------- 6657 100 0 0 200 2014 6658 300 0 0 400 2015 6659 500 0 0 600 2016 2014 2015 2016 ---
select cid,x1,x2,x3,x4,fy
from temp_table;
cid x1 x2 x3 x4 fy
----------------------------
6657 100 0 0 200 2014
6658 300 0 0 400 2015
6659 500 0 0 600 2016
2014 2015 2016
-------------------------
x1 100 300 500
x2 0 0 0
x3 0 0 0
x4 200 400 600
我想让它在输出后重写打印
select cid,x1,x2,x3,x4,fy
from temp_table;
cid x1 x2 x3 x4 fy
----------------------------
6657 100 0 0 200 2014
6658 300 0 0 400 2015
6659 500 0 0 600 2016
2014 2015 2016
-------------------------
x1 100 300 500
x2 0 0 0
x3 0 0 0
x4 200 400 600
如何实现这一点?这里有一种方法可以通过子查询和聚合实现这一点:
select name,
sum(case when fy = 2014 then x end) as "2014",
sum(case when fy = 2015 then x end) as "2015",
sum(case when fy = 2016 then x end) as "2016"
from (select fy,
(case when n.n = 1 then 'x1'
when n.n = 2 then 'x2'
when n.n = 3 then 'x3'
when n.n = 4 then 'x4'
end) as name,
(case when n.n = 1 then x1
when n.n = 2 then x2
when n.n = 3 then x3
when n.n = 4 then x4
end) as x
from temp_table cross join
(select 1 as n from dual union all
select 2 from dual union all
select 3 from dual union all
select 4 from dual
) n
) t
group by name;
您也可以使用
pivot
,但这是对Oracle SQL的最新添加,因此我倾向于使用此方法。更通用的解决方案是使用此方法。您的
temp_表
已经是一个透视表,其中(x1 x2 x3 x4)为x轴,fy为y轴首先,我们需要将温度表解除锁定到解除锁定的温度表中,然后将fy轴作为x轴,将(x1 x2 x3 x4)轴作为y轴:
with unpivoted_temp_table as (
SELECT *
FROM temp_table
UNPIVOT (
totalSales
FOR x
IN (x1, x2, x3, x4)
)
)
select *
FROM unpivoted_temp_table
PIVOT (
SUM(totalSales)
FOR fy
IN (2014, 2015, 2016)
)
order by 1 --order by column X
在Oracle 11G中有三种可能的转置选项
- 解码选项
- a。如果要转置,请对新列使用SUM和DECODE 总结
- b。如果要转置,请对新列使用MAX和DECODE 不作总结
- 使用枢轴
- 如Gordon所述,与和子选择一起使用
WITH TEMP1
AS (SELECT
6657 AS CID,
100 AS VAL,
'X1' AS XCORD,
2014 AS FY
FROM
DUAL
UNION ALL
SELECT
6657 AS CID,
0 AS VAL,
'X2' AS XCORD,
2014 AS FY
FROM
DUAL
UNION ALL
SELECT
6657 AS CID,
0 AS VAL,
'X3' AS XCORD,
2014 AS FY
FROM
DUAL
UNION ALL
SELECT
6657 AS CID,
200 AS VAL,
'X4' AS XCORD,
2014 AS FY
FROM
DUAL
UNION ALL
SELECT
6658 AS CID,
300 AS VAL,
'X1' AS XCORD,
2015 AS FY
FROM
DUAL
UNION ALL
SELECT
6658 AS CID,
0 AS VAL,
'X2' AS XCORD,
2015 AS FY
FROM
DUAL
UNION ALL
SELECT
6658 AS CID,
0 AS VAL,
'X3' AS XCORD,
2015 AS FY
FROM
DUAL
UNION ALL
SELECT
6658 AS CID,
400 AS VAL,
'X4' AS XCORD,
2015 AS FY
FROM
DUAL
UNION ALL
SELECT
6659 AS CID,
500 AS VAL,
'X1' AS XCORD,
2016 AS FY
FROM
DUAL
UNION ALL
SELECT
6659 AS CID,
0 AS VAL,
'X2' AS XCORD,
2016 AS FY
FROM
DUAL
UNION ALL
SELECT
6659 AS CID,
0 AS VAL,
'X3' AS XCORD,
2016 AS FY
FROM
DUAL
UNION ALL
SELECT
6659 AS CID,
600 AS VAL,
'X4' AS XCORD,
2016 AS FY
FROM
DUAL)
SELECT
*
FROM
(SELECT
XCORD,
FY,
SUM ( VAL ) AS VAL
FROM
TEMP1
GROUP BY
XCORD,
FY) PIVOT (SUM ( VAL ) FOR FY IN ('2014', '2015', '2016'))
ORDER BY
XCORD;
结果:
XCORD '2014' '2015' '2016'
----- ------ ------ ------
X1 100 300 500
X2 0 0 0
X3 0 0 0
X4 200 400 600
如果查看数据集,可以看到结果是
CID VAL XCORD FY
---- ---- ----- ----
6657 100 X1 2014
6657 0 X2 2014
6657 0 X3 2014
6657 200 X4 2014
6658 300 X1 2015
6658 0 X2 2015
6658 0 X3 2015
6658 400 X4 2015
6659 500 X1 2016
6659 0 X2 2016
6659 0 X3 2016
6659 600 X4 2016
这或多或少是对数据的取消pivot。您可以使用取消pivot和pivot的组合来完成
select * from
(select * from
(select x1,x2,x3,x4,fy from table1)
unpivot(val for x in (x1,x2,x3,x4)))
pivot(sum(val) for fy in (2014,2015,2016))
你知道如何使用
pivot
吗?我正在使用oracle 11g。可能有一种情况,我们的查询输出中有n个年份,因此转置的查询应该有n+1列