Oracle11g Oracle 10g和11g r2中的Pivot
我有一张桌子需要转动。我在我的系统上使用oracle 11g R2,服务器上运行oracle 10g 我的表格包含以下数据: 原产地表:pplOracle11g Oracle 10g和11g r2中的Pivot,oracle11g,oracle10g,Oracle11g,Oracle10g,我有一张桌子需要转动。我在我的系统上使用oracle 11g R2,服务器上运行oracle 10g 我的表格包含以下数据: 原产地表:ppl ename | edate emp1 | 01-10-17 emp1 | 01-10-17 emp1 | 01-10-17 emp1 | 02-10-17 emp2 | 01-10-17 emp3 | 01-10-17 emp3 | 01-10-17 emp3 | 02-10-17 emp3 | 02-10-17 通常在pivot中,输出应为: 产出表
ename | edate
emp1 | 01-10-17
emp1 | 01-10-17
emp1 | 01-10-17
emp1 | 02-10-17
emp2 | 01-10-17
emp3 | 01-10-17
emp3 | 01-10-17
emp3 | 02-10-17
emp3 | 02-10-17
通常在pivot中,输出应为:
产出表1:
ename | 01-10-17 | 02-10-17
emp1 | 3 | 1
emp2 | 1 | 0
emp3 | 2 | 2
但这里有一个条件,每天的计数必须大于1。因此,期望的输出将是:
产出表2:
ename | 01-10-17 | 02-10-17
emp3 | 2 | 2
我在11g中使用pivot来获得所需的输出,并且输出部分正确
select * from
(
SELECT ename, edate
FROM ppl
)
PIVOT
(
COUNT(edate)
FOR edate in('01-oct-2017', '02-oct-2017')
)
order by ename;
上面的查询只返回输出表1中的透视。
我的问题1是在pivot查询中可以将筛选器放在哪里?
在尝试在10g中获得相同的输出时,我发现pivot命令在那里不受支持。
下面是我对10g的查询:
select ename,
count(case when edate ='01-10-2017' then ename end) "01-OCT-2017",
count(case when edate ='02-10-2017' then ename end) "02-OCT-2017"
from ppl
group by ename
having count(case when edate ='01-10-2017' then ename end) >1
and count(case when edate ='02-10-2017' then ename end) >1
order by ename;
这将根据需要提供精确的输出2表。
我的第二个问题是,日期甚至可以是30天。据我所知,对于这种情况,我需要将“计数(当edate='01-10-2017'然后是ename end时的情况)”和“计数(当edate='01-10-2017'然后是ename end时的情况)>写30次。
这么大的疑问会不会影响产出时间?或者有什么可行的方法可以做得更好?
谢谢你的帮助 Q1。where条款可包含在枢轴之前:
select * from
(
SELECT ename, edate
FROM ppl
WHERE .......
)
PIVOT
(
COUNT(edate)
FOR edate in('01-oct-2017', '02-oct-2017')
)
order by ename;
问题2。是的,你可以有许多大小写表达式,它不会是一个大的性能打击
或者有什么可行的方法可以做得更好?您可以通过“动态SQL”来实现它,但查询结构将保持不变。动态sql只是为您构建查询sql。Q1。where条款可包含在枢轴之前:
select * from
(
SELECT ename, edate
FROM ppl
WHERE .......
)
PIVOT
(
COUNT(edate)
FOR edate in('01-oct-2017', '02-oct-2017')
)
order by ename;
问题2。是的,你可以有许多大小写表达式,它不会是一个大的性能打击
或者有什么可行的方法可以做得更好?您可以通过“动态SQL”来实现它,但查询结构将保持不变。动态sql只是为您构建查询sql。绿色表示第二季度。绿色表示第二季度。