oracle查询中的行数相同

时间:2017-11-04 00:36:05

标签: sql oracle plsql

我是PL / SQL的新手

我正在尝试查询以显示一些购买及其日期。问题是,我希望确保查询结果为每个日期返回一些具有相同行数的分组,具体取决于最大子集的数量。

以下是Oracle的一个示例:

   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

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

提前致谢!

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然后提供现有信息。