在 Oracle 10g 和 11g r2 中转换

Pivot in Oracle 10g and 11g r2

我有一个 table 需要调整。我在我的系统上使用 oracle 11g R2,服务器机器上有 oracle 10g 运行。

我的 table 包含数据: 来源Table: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 中,输出应该是: 输出 table 1:

ename | 01-10-17 | 02-10-17
emp1  |      3   |      1
emp2  |      1   |      0
emp3  |      2   |      2

但这里有一个条件,即每天计数必须 >1。所以期望的输出将是: 输出 table 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;

上面的查询returns只有输出中的主元table1。 我的问题 1 是我可以在数据透视查询中将过滤器放在哪里?

在尝试在 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 table。 我的问题 2 是日期甚至可以长达 30 天。据我所知,对于这种情况,我需要写 "count(case when edate ='01-10-2017' then ename end) "01-OCT-2017"" 和 "count(case when edate ='01-10-2017' then ename end) >1" 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;

Q2。是的,你可以有很多 case 表达式,这不会对性能造成很大影响。

或者有更好的可行方法吗? 您可以通过 "dynamic SQL" 来实现它,但查询结构将保持不变。动态 sql 只是为您构建查询 SQL。