转向Oracle 10g和11g r2

时间:2017-10-15 16:26:30

标签: 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

通常在枢轴中,输出应为: 输出表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是在哪里可以将过滤器放入数据透视查询中?

试图在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表。 我的问题2是日期甚至可以达到30天。据我所知,对于那种情况,我需要写“count(edate = '01 -10-2017',然后ename end)”01-OCT-2017“”和“count(edate = '01 -10时的情况) -2017'然后ename end)> 1“30次。 这样一个大问题会不会妨碍输出时间?或者有更好的方法来做到这一点吗?

谢谢你的帮助.. !!

1 个答案:

答案 0 :(得分:0)

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。是的,你可以有很多案例表达,它不会是一个很大的性能影响。

或者有没有可行的方法来更好地做到这一点?你可以通过"动态SQL"来实现它。相反,但查询结构将保持不变。动态SQL只是为您构建查询SQL。