2017-11-04 105 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 –

相關問題