Oracle11g Oracle 10g和11g r2中的Pivot

Oracle11g 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中,输出应为: 产出表

我有一张桌子需要转动。我在我的系统上使用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中,输出应为: 产出表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。

绿色表示第二季度。绿色表示第二季度。