Oracle查询不计算星期一.........星期日和特定时间特定时间的工作总数?

时间:2016-05-23 10:11:44

标签: sql oracle

我有一张桌子

JobID   Date_of_Completion  Region    day
1        23/05/2016          South    monday
2        23/05/2016           north   monday
3        23/05/2016            north  monday
4        23/05/2016            east   monday
5        22/05/2016          South    sunday
6        22/05/2016           north   sunday
7       22/05/2016            south sunday
8       22/05/2016            east  sunday
.
.
.
..
23        2/05/2016            north  monday
24        2/05/2016            east   monday
25        2/05/2016          South    monday
26        2/05/2016           north   monday
27       2/05/2016            south monday
28       2/05/2016            east  monday      

期望的输出: 过去两个月

Day           Region      countofjobsonparticularday          no of days
sunday         south            34               8 (no of sund forlast 2 months)
sunday         north            24               8 (no of sund forlast 2 months)
monday         south            74              9 (no of mon forlast 2 months)
tuesday        east            64               8 (no of tue forlast 2 months)

如何编写查询?请帮助我

3 个答案:

答案 0 :(得分:0)

看来你需要这样的东西:

select Day, Region, count(1), count(distinct date_of_completion)
from your_table
where date_of_completion between add_months(sysdate, -2) and sysdate
group by Day, Region

这将计算作业数量和完成作业的DISTINCT天数。 您应该根据您的需要(例如,您希望如何考虑小时,分钟......)来改进这一点

答案 1 :(得分:0)

如果 - 我怀疑 - 你的意思是最后一栏no of days,应该显示过去两个月的星期一,星期二等总数(无论是否有任何工作(天)),首先创建一个(子)查询,然后在Day列上加入Aleksej的结果。说到Day,它是一个Oracle关键字;最好避免使用Oracle关键字作为表名或列名。我在下面使用day_name。

查询结果(可用作子查询):

DAY_NAME                CT
--------------- ----------
monday                   9
thursday                 8
sunday                   9
saturday                 9
tuesday                  8
friday                   9
wednesday                8

我没有对结果进行排序(如果用于连接则不需要),我使用低限制,就像OP那样。这由格式模型控制(查询中的to_char的中间参数,如下所示;如果需要大写的名称,如星期一,请将其从'day'更改为'Day')。< / p>

查询:

with x (day_name) as (
        select to_char(sysdate - level + 1, 'day', 'nls_date_language = American') 
        from   dual 
        connect by level <= sysdate - add_months(sysdate, -2) - 1
     )
select   day_name, count(*) as ct
from     x
group by day_name;

注意'nls_date_language = American' - 最好是明确表示而不是依赖默认参数。 (如果没有这第三个论点,那么使用德语或中文日期语言运行它的其他人将无法获得加入另一个表的预期结果。)此外,&#34;最后两个月的定义&#34;模糊;我使用了今天(包括)和两个月前(即2016年3月24日到5月23日之间)的所有日子。这些日期由包含sysdate的两个表达式控制。

答案 2 :(得分:0)

感谢@mathguy和@Aleksej

我尝试了这个有效的查询

选择to_char(dayofcompletion,&#39; DY&#39;)as day_name,count(1),count(distinct(trunc(dayofcompletion)))as noofdays 来自tablename 其中trunc(dayofcompletion)&gt; = trunc(sysdate-60)和trunc(dayofcompletion)&lt; = trunc(sysdate-1)
按to_char分组(dayofcompletion,&#39; DY&#39;)