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