Sql 简化现有查询(with子句带有subselect from dual)
我有如下一些查询,希望简化这些查询。 有没有一个较短的方法来获得相同的结果。 如果可能的话,我想不使用Sql 简化现有查询(with子句带有subselect from dual),sql,oracle,Sql,Oracle,我有如下一些查询,希望简化这些查询。 有没有一个较短的方法来获得相同的结果。 如果可能的话,我想不使用with子句,也不使用dual表。 也许有分析功能 with tab1 as ( select DEPARTMENT1,DEPARTMENT2,DEPARTMENT3,DEPARTMENT4,DEPARTMENT5,DEPARTMENT6,DEPARTMENT7,DEPARTMENT8 from RECLAMATION where RECLAMATIONDAT
with子句,也不使用dual
表。
也许有分析功能
with tab1 as
( select
DEPARTMENT1,DEPARTMENT2,DEPARTMENT3,DEPARTMENT4,DEPARTMENT5,DEPARTMENT6,DEPARTMENT7,DEPARTMENT8
from
RECLAMATION
where
RECLAMATIONDATE between to_Date('20150101','YYYYMMDD') and to_Date('20151231','YYYYMMDD')
)
select
(select count(*) from tab1 ) sumAll,
(select count(*) from tab1 where DEPARTMENT1=1) sum1,
(select count(*) from tab1 where DEPARTMENT2=1) sum2,
(select count(*) from tab1 where DEPARTMENT3=1) sum3,
(select count(*) from tab1 where DEPARTMENT4=1) sum4,
(select count(*) from tab1 where DEPARTMENT5=1) sum5,
(select count(*) from tab1 where DEPARTMENT6=1) sum6,
(select count(*) from tab1 where DEPARTMENT7=1) sum7,
(select count(*) from tab1 where DEPARTMENT8=1) sum8
from dual;
共有8个部门栏目。如果部门参与回收,则每个包含值1,否则包含值0
结果如下:
sumAll | sum1 | sum2 | sum3 | sum4 | sum5 | sum6 | sum7 | sum8
-------+------+------+------+------+------+------+------+-----
100 | 14 | 71 | 53 | 18 | 0 | 19 | 17 | 88
表结构是给定的,不能重新设计它。使用case
表达式进行条件计数:
select count(*),
sum(case when DEPARTMENT1=1 then 1 else 0 end) as dep1,
...
sum(case when DEPARTMENT8=1 then 1 else 0 end) as dep8
from
RECLAMATION
where
RECLAMATIONDATE between to_Date('20150101','YYYYMMDD') and to_Date('20151231','YYYYMMDD')
共有8个部门栏目。如果部门参与回收,则每个包含值1,否则包含值0
注意,我使用了提取
来过滤日期,就像使用在
之间一样。您将获得日期,包括2015-12-31T00:00:00
,但它将忽略2015-12-31T00:00:01
和2015-12-31T23:59:59
(我假设这不是您所需要的)。似乎是一个糟糕的表设计。你真的有8个不同的部门专栏吗?!?是的,有8个部门栏目。如果部门参与回收,则每个包含值1,如果部门未参与回收,则包含值0。表结构已给出,我必须做最好的工作。谢谢,这要简单得多。在这种情况下,时间总是00:00:00,因此在工作之间。但我会注意到你关于未来提取年份的提示。如果你想使用between,那么你可以始终使用ANSI日期文字来简化事情:其中RECLAMATIONDATE介于日期“2015-01-01”和日期“2015-12-31”之间。
SELECT COUNT(*) AS SumAll,
SUM( DEPARTMENT1 ) AS Sum1,
SUM( DEPARTMENT2 ) AS Sum2,
SUM( DEPARTMENT3 ) AS Sum3,
SUM( DEPARTMENT4 ) AS Sum4,
SUM( DEPARTMENT5 ) AS Sum5,
SUM( DEPARTMENT6 ) AS Sum6,
SUM( DEPARTMENT7 ) AS Sum7,
SUM( DEPARTMENT8 ) AS Sum8
FROM RECLAMATION
WHERE EXTRACT( YEAR FROM RECLAMATIONDATE ) = 2015