2017-11-04 80 views
1

我真的很新PL/SQL在oracle查询中相同的行数

我试图做一个查询来显示一些购买和他们的日期。问题是,我想确保查询的结果返回给我某种group-by,每个日期的行数相同,具体取决于最大子集的数量。

下面是关于甲骨文的例子:

select date_val, cost 
    from test 
    order by date_val 

,给了我这样的结果:

date_val cost 
    03/04/2017 950907.12 
    03/04/2017 10935431.88 
    03/04/2017 1411410 
    03/04/2017 504604380 
    04/04/2017 1348410 
    05/04/2017 1379000560 
    05/04/2017 1208340 
    05/04/2017 1735016.32 
    06/04/2017 15913063.36 
    06/04/2017 1383744.64 
    06/04/2017 1522710 
    06/04/2017 1172111669 
    07/04/2017 278336734 
    07/04/2017 579649.52 

在这种情况下,最大的子集的长度是4(日期03和06 ),所以我想完成表格,并得到这样的东西:

date_val cost 
    03/04/2017 950907.12 
    03/04/2017 10935431.88 
    03/04/2017 1411410 
    03/04/2017 504604380 
    04/04/2017 1348410 
    04/04/2017 0 
    04/04/2017 0 
    04/04/2017 0 
    05/04/2017 1379000560 
    05/04/2017 1208340 
    05/04/2017 1735016.32 
    05/04/2017 0 
    06/04/2017 15913063.36 
    06/04/2017 1383744.64 
    06/04/2017 1522710 
    06/04/2017 1172111669 
    07/04/2017 278336734 
    07/04/2017 579649.52 
    07/04/2017 0 
    07/04/2017 0 

任何建议都会非常有帮助。

在此先感谢!

+0

是'date'数据类型中的日期吗? (如果没有,为什么不呢?)如果是,什么是时间组件?在Oracle中,'date'总是具有时间分量,即使它不显示在屏幕上。有可能你的日期的时间是'00:00:00'(通常的做法是让日期成为“纯粹”的日期,没有时间) - 是这种情况吗? – mathguy

+0

另外,如果某个日期完全缺失(假设04/04没有行),您是否仍然希望将它添加到结果中,四行,每个行的成本都是0? – mathguy

+0

你好!是的,数据类型是日期,但正如你所说,它们是纯日期,没有时间。 而对于另一个问题,我只想显示在桌子上的日期,如果04/04没有出现,那么我不想看到它,但如果它至少有1条记录,我希望它填写其余记录与成本0 –

回答

3

下面是一个方法:

with t as (
     select date_val, cost, 
      row_number() over (partition by date_val order by cost) as seqnum 
     from test 
    ) 
select d.date_val, coalesce(t.cost, 0) as cost 
from (select distinct date_val from t) d cross join 
    (select distinct seqnum from t) s left join 
    t 
    on d.date = t.date and s.seqnum = t.seqnum 
order by d.date_val; 

的想法是一个序列号添加到每个行每个日期。然后,将每个不同的日期与每个不同的序列号交叉连接。这给你的行。 left join然后给出现有的信息。

+0

塔克你这么多的帮助!这对我想展示的东西非常有用! :d –