在 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。
我有一个 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。