2017-11-04 11 views
1

저는 PL/SQL에서 새로운 제품입니다.오라클 쿼리의 행 수가 동일합니다.

일부 구매 항목과 날짜를 표시하려고 쿼리를 작성하려고합니다. 그 점은 쿼리의 결과가 나에게 가장 큰 하위 집합의 수에 따라 각 날짜의 행 수가 같은 일종의 그룹 별을 반환하도록하고 싶습니다.

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 

어떤 제안이라도 도움이 될 것입니다.

미리 감사드립니다.

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; 

아이디어는 각 날짜에 대해 각 행에 일련 번호를 추가하는 것입니다

+0

날짜가'date' 데이터 유형입니까? (그렇지 않다면 왜 안 되겠습니까?) 그렇다면 시간 구성 요소는 무엇입니까? 오라클에서 '날짜'는 화면에 표시되지 않더라도 항상 시간 구성 요소를 포함합니다. 모든 날짜에 '00 : 00 : 00'의 시간이있을 수 있습니다 (시간을 사용하지 않고 날짜를 "순수"날짜로 만드는 일반적인 방법) - 그 경우입니까? – mathguy

+0

또한 날짜가 완전히 누락 된 경우 (04/04의 행이 없다고 가정 해 보겠습니다.) 결과에 행 추가가 필요하겠습니까? 4 행, 각 행의 비용은 0입니다. – mathguy

+0

안녕하세요! 네, 데이터 타입은 날짜입니다.하지만 여러분이 말했듯이, 그것들은 순수한 날짜이며 시간은 없습니다. 그리고 다른 질문에 대해, 나는 오직 04/04가 전혀 나타나지 않는다면 나는 그것을보고 싶지 않지만 적어도 1 개의 레코드를 가지고 있다면 그것을 가지고 테이블에있는 날짜를 표시하고 싶습니다. 나머지 기록을 비용 0으로 채우십시오. –

답변

3

여기 하나의 방법입니다. 그런 다음 서로 다른 일련 번호로 각기 다른 날짜를 교차 가입하십시오. 그것은 당신에게 행을 제공합니다. 그러면 left join은 기존 정보를 제공합니다.

+0

도움을 청합니다. 이것은 내가 보여주고 싶었던 것을 위해 매우 잘 작동했습니다! :디 –