Sql 如何单独显示和识别每个月的所有日期(如周一、周二)?

Sql 如何单独显示和识别每个月的所有日期(如周一、周二)?,sql,oracle,dayofweek,Sql,Oracle,Dayofweek,请帮帮我。我被困了好几个小时。我希望每个月单独显示所有日期(例如星期一、星期二),并显示每一天的相应日期 我该怎么做?我真的需要帮助。多谢各位 期望输出: Data,Date,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday Data,04/01/2014,10,12,5,6,1,0,15 Data,04/07/2014,14,1,5,6,1,2,18 Data,04/14/2014,11,12,5,6,1,0,17 下面是SQL

请帮帮我。我被困了好几个小时。我希望每个月单独显示所有日期(例如星期一、星期二),并显示每一天的相应日期

我该怎么做?我真的需要帮助。多谢各位

期望输出:

Data,Date,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
Data,04/01/2014,10,12,5,6,1,0,15
Data,04/07/2014,14,1,5,6,1,2,18
Data,04/14/2014,11,12,5,6,1,0,17
下面是SQL脚本:

select 'Data'
||','||to_char(d.dtime_day, 'MM/dd/yyyy')
||','||nvl(m.mtotal, 0)
||','||nvl(tu.tutotal, 0)
||','||nvl(w.wtotal, 0)
||','||nvl(th.thtotal, 0)
||','||nvl(f.ftotal, 0)
||','||nvl(s.stotal, 0)
||','||nvl(su.sutotal, 0)
from table0.dc_date d
left join (
        select trunc(t.create_time) as monday
              ,count(t.create_time) as mtotal
        from table.table1 t
        left join table.table2 q
        on q.id = t.queue_id
        where t.create_time between trunc(sysdate,'DD')-12*7 and sysdate -1
        and q.name not like 'item0%'
        or q.name not like 'item%'
        group by trunc(t.create_time)
) m on d.dtime_day = m.monday
left join (
        select trunc(t.create_time, 'DD') as tuesday
              ,count(t.create_time) as tutotal
        from table.table1 t
        left join table.table2 q
        on q.id = t.queue_id
        where t.create_time between trunc(sysdate,'DD')-12*7 and sysdate -1
        and q.name not like 'item0%'
        or q.name not like 'item%'

        group by trunc(t.create_time, 'DD')
) tu on d.dtime_day = tu.tuesday
left join (
        select trunc(t.create_time, 'DD') as wednesday
              ,count(t.create_time) as wtotal
         from table.table1 t
        left join table.table2 q
        on q.id = t.queue_id
        where t.create_time between trunc(sysdate,'DD')-12*7 and sysdate -1
        and q.name not like 'item0%'
        or q.name not like 'item%'
        group by trunc(t.create_time, 'DD')
) w on d.dtime_day = w.wednesday
left join (
        select trunc(t.create_time, 'DD') as thursday
              ,count(t.create_time) as thtotal
         from table.table1 t
        left join table.table2 q
        on q.id = t.queue_id
        where t.create_time between trunc(sysdate,'DD')-12*7 and sysdate -1
        and q.name not like 'item0%'
        or q.name not like 'item%'
        group by trunc(t.create_time, 'DD')
) th on d.dtime_day = th.thursday
left join (
        select trunc(t.create_time, 'DD') as friday
              ,count(t.create_time) as ftotal
        from table.table1 t
        left join table.table2 q
        on q.id = t.queue_id
        where t.create_time between trunc(sysdate,'DD')-12*7 and sysdate -1
        and q.name not like 'item0%'
        or q.name not like 'item%'
        group by trunc(t.create_time, 'DD')
) f on d.dtime_day = f.friday
left join (
        select trunc(t.create_time, 'DD') as saturday
              ,count(t.create_time) as stotal
        from table.table1 t
        left join table.table2 q
        on q.id = t.queue_id
        where t.create_time between trunc(sysdate,'DD')-12*7 and sysdate -1
        and q.name not like 'item0%'
        or q.name not like 'item%'
        group by trunc(t.create_time, 'DD')
) s on d.dtime_day = s.saturday
left join (
        select trunc(t.create_time, 'DD') as sunday
              ,count(t.create_time) as sutotal
        from table.table1 t
        left join table.table2 q
        on q.id = t.queue_id
        where t.create_time between trunc(sysdate,'DD')-12*7 and sysdate -1
        and q.name not like 'item0%'
        or q.name not like 'item%'
        group by trunc(t.create_time, 'DD')
) su on d.dtime_DAY = su.sunday
where d.dtime_day between trunc(sysdate,'DD')-12*7 and trunc(sysdate) -1
and trunc(d.dtime_day, 'DD')= d.dtime_day
order by d.dtime_day


我还想在每天中显示日期

所有左侧的join子查询似乎都在做同样的事情,实际上您并没有在一周中的某一天限制任何内容。您只需要加入一次,然后需要关注该加入的结果。如果您使用的是11g,您可以使用真正的pivot:

select 'Data'
  ||','|| to_char(week_start, 'MM/dd/yyyy')
  ||','|| mon_cnt
  ||','|| tue_cnt
  ||','|| wed_cnt
  ||','|| thu_cnt
  ||','|| fri_cnt
  ||','|| sat_cnt
  ||','|| sun_cnt
from (
  select 'Data',
    next_day(d.dtime_day - 7, 'Monday') as week_start,
    to_char(d.dtime_day, 'Dy') as day_of_week,
    t.create_time
  from dc_date d
  left join table1 t
  on t.create_time >= d.dtime_day
  and t.create_time < d.dtime_day + 1
  left join table2 q
  on q.id = t.queue_id
  and (q.name not like 'item0%' or q.name not like 'item%')
  where d.dtime_day between trunc(sysdate) - (12*7) and trunc(sysdate) -1
)
pivot (count(create_time) as cnt for (day_of_week)
  in ('Mon' as mon, 'Tue' as tue, 'Wed' as wed, 'Thu' as thu,
    'Fri' as fri, 'Sat' as sat, 'Sun' as sun))
order by week_start;
。。。两个查询都得到:

Data,03/24/2014,0,0,0,0,0,0,0
Data,03/31/2014,0,0,0,0,0,0,0
Data,04/07/2014,0,1,0,0,0,0,1
Data,04/14/2014,0,0,0,0,1,0,0
Data,04/21/2014,0,2,0,0,0,0,0

我为昨天创建了两条记录,因此从4月21日(星期一)开始的一周的
2
出现在“星期二”列中。我想这就是你想要的。

你可能想发布一些起始数据。这怎么会让你失望?请注意,Oracle有
PIVOT
,这意味着您不必这样做。假设
create\u time
是一个时间戳,
介于
之间。是否可以显示日期以及相应的日期?@Yang-对不起,我不知道你的意思。也许现在可以将您想要的输出添加到问题中?我还想显示每周的相应日期,例如2014年1月4日星期一、2014年2月4日星期二/2014@Yang-但是在哪里?您的输出有12周的数据,那么是哪一周的日期/日期,这与计数的输出有什么关系?举个例子来说明你想要什么会更容易,比如说我们有一周,一周内有7天,每一天都有各自的日期,对吗?就像在脚本中一样,它的输出显示每周的日期,每周显示日期名称为的数据数,对吗?现在,我想显示每周的天数和日期
create table dc_date (dtime_day date);
insert into dc_date
select date '2014-03-28' + level
from dual
connect by level < 30;

create table table1 (create_time date, queue_id number);
insert into table1 values (sysdate - 1, 1);
insert into table1 values (sysdate - 0.75, 1);
insert into table1 values (sysdate - 5, 1);
insert into table1 values (sysdate - 10, 1);
insert into table1 values (sysdate - 15, 1);

create table table2 (id number, name varchar2(10));
insert into table2 values (1, 'anything');
Data,03/24/2014,0,0,0,0,0,0,0
Data,03/31/2014,0,0,0,0,0,0,0
Data,04/07/2014,0,1,0,0,0,0,1
Data,04/14/2014,0,0,0,0,1,0,0
Data,04/21/2014,0,2,0,0,0,0,0