database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41037 게시물 읽기
No. 41037
초보 개발자 쿼리 질문 좀 드릴게요
작성자
황수영(diss)
작성일
2015-12-22 10:25ⓒ
2015-12-22 10:37ⓜ
조회수
8,899

일하기 시작한지 한달된 초보 개발자입니다.

item_name/ item_kind/ unit / day_pri /regday

마늘 /  깐마늘 / 1kg / 8000/ 20151222

이와 같은테이블에서 올해 매달의 순별 즉 초순 중순 하순의 평균가격과

평년(5년간) 매달의 초순,중순,하순의 평균 가격을 구하는 쿼리를 아래와 같이 짰는데요,

 

초순 중순 하순의 합이 결국 한달의 가격과 같아야 하는데

한달의 가격과 차이가 계속 나는데 원인을 잘 모르겠습니다

틀린부분과 한달 평균가와 차이가 나는 원인을  알고 싶습니다.

 

더불어 수정 방향도 알려주시면 고맙구요 ㅠ

쿼리는 다음과 같습니다. 

select  basDate,wsalPrice,avgPrice

from(    

 select a.md basDate, round (a.ps) wsalPrice, round(b.ps) avgPrice 

  from

(SELECT substr(regday,5,2)||'월 초순' md,substr(regday,3,4)||'a' ma,avg(dailyPrice ) ps

 FROM 

  (SELECT  regday , day_pri AS dailyPrice  

          FROM  day_kamis_pri_info

WHERE  item_name = '마늘'  

and item_kind ='깐마늘'

 and unit = '1kg'

       AND  regday BETWEEN (select substr(max(regday),1,7)-20||1 from day_kamis_pri_info) AND  (select max(regday) from day_kamis_pri_info)

         

                 where  substr(regday,7,2) between '01' and '10'

             GROUP  BY substr(regday,5,2),substr(regday,3,4)

              union all

                           SELECT substr(regday,5,2)||'월 중순' md,substr(regday,3,4)||'b' ma,avg(dailyPrice ) ps

  FROM (SELECT  regday , day_pri AS dailyPrice  

          FROM  day_kamis_pri_info

 WHERE  item_name ='마늘'

  and item_kind ='깐마늘'

 and unit = '1kg'

          AND  regday BETWEEN (select substr(max(regday),1,7)-20||1 from day_kamis_pri_info) AND  (select max(regday) from day_kamis_pri_info)

                        ) 

                where  substr(regday,7,2) between '11' and '20'

             GROUP  BY substr(regday,5,2),substr(regday,3,4)

          union all

                           SELECT substr(regday,5,2)||'월 하순' md,substr(regday,3,4)||'c' ma,avg(dailyPrice ) ps

  FROM (SELECT  regday , day_pri AS dailyPrice  

        FROM  day_kamis_pri_info

               WHERE  item_name = '마늘'

                                               and item_kind ='깐마늘'

                      and unit = '1kg'   

      AND  regday BETWEEN (select substr(max(regday),1,7)-20||1 from day_kamis_pri_info) AND  (select max(regday) from day_kamis_pri_info)

                        ) 

              where  substr(regday,7,2) between '21' and '31'

             GROUP  BY substr(regday,5,2),substr(regday,3,4)

             order by ma) a

,((select * from 

(SELECT substr(regday,5,2)||'월 초순' md,substr(regday,5,2)||'a' ma,avg(dailyPrice ) ps

FROM (SELECT  regday ,  day_pri AS dailyPrice  

       FROM  day_kamis_pri_info

     WHERE  item_name = '마늘'

                      and item_kind ='깐마늘'

                       and unit = '1kg'

                  AND  regday BETWEEN (select substr(max(regday),1,4)-5||0101 from day_kamis_pri_info) AND  (select substr(max(regday),1,4)-1||1231  from day_kamis_pri_info)

        ) 

                where  substr(regday,7,2) between '01' and '10'

             GROUP  BY substr(regday,5,2)

      union all

SELECT substr(regday,5,2)||'월 중순' md,substr(regday,5,2)||'b' ma,avg(dailyPrice ) ps

FROM (SELECT  regday , day_pri AS dailyPrice 

             FROM  day_kamis_pri_info

      WHERE  item_name = '마늘'

              AND  regday BETWEEN (select substr(max(regday),1,4)-5||0101 from day_kamis_pri_info) AND  (select substr(max(regday),1,4)-1||1231  from day_kamis_pri_info)

)  where  substr(regday,7,2) between '11' and '20'

             GROUP  BY substr(regday,5,2)

union all            

                SELECT substr(regday,5,2)||'월 하순' md,substr(regday,5,2)||'c' ma,avg(dailyPrice ) ps

FROM (SELECT  regday , day_pri AS dailyPrice 

    FROM  day_kamis_pri_info

 WHERE  item_name ='마늘'

                        and item_kind ='깐마늘'

                          and unit = '1kg'

AND  regday BETWEEN (select substr(max(regday),1,4)-5||0101 from day_kamis_pri_info) AND  (select substr(max(regday),1,4)-1||1231  from day_kamis_pri_info)

       ) 

              where  substr(regday,7,2) between '21' and '31'

             GROUP  BY substr(regday,5,2)

order by ma))    ) b

where a.md=b.md)

 

이 글에 대한 댓글이 총 3건 있습니다.

SUBSTR(MAX(regday),1,7)-20||1    <-- 어떤 의도로 사용한 코드인지 몰라도 잘못된 코드임이 분명합니다.
SUBSTR(MAX(regday),1,4)-5||0101  <-- 0101 을 따옴표 없이 사용하여 앞에 0 이 사라집니다.

마농(manon94)님이 2015-12-24 10:01에 작성한 댓글입니다.
이 댓글은 2015-12-24 10:10에 마지막으로 수정되었습니다.

 답변 감사합니다 

 

일단 지적하신 SUBSTR(MAX(regday),1,4)-5||0101 부분은 수정하였습니다.

 

그리고 SUBSTR(MAX(regday),1,7)-20||1 은

 

시작 날짜를 설정하는데 있어서

 

2달전의 초 중 하순중 현재 날짜가 속한 초 중 하순의 시작점을 구하기 위해 사용하였습니다

 

이를테면 오늘이 12월28일이니 하순이기 때문에 10월의 하순의 시작점을 설정하기위해 사용하였습니다. 

 

만약 잘못된 부분이라면 어떤식으로 바꿔야 할지 답변 부탁드립니다

 

 

황수영(diss)님이 2015-12-28 10:47에 작성한 댓글입니다.

2달전의 초 중 하순중 현재 날짜가 속한 초 중 하순의 시작점을 구할 때 문제점
현재가 하순일 때 2달전 하순부터 현재월 하순까지를 기간으로 조회하면
하순은 3번 카운트 되는 반면, 초순과 중순은 2번만 카운트 됨
(하 초 중 하 초 중 하)
횟수를 일치시킬 필요가 있음
3개월평균? / 2개월 평균?


현재가 하순이긴 하지만 날짜상 하루밖에 안되었을 때.
21일인 경우
초순, 중순은 10일치 평균을 구하는데 하순만 하루치 평균을 구하게 됨.

마농(manon94)님이 2015-12-29 10:22에 작성한 댓글입니다.
이 댓글은 2015-12-29 10:40에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
41041데이터를 1년 전체 표로 표현하기 [1]
김형우
2015-12-28
8600
41039쉼표로 옆으로 표현된 데이타를 세로로 표현하기 [1]
정재영
2015-12-24
8633
41038한 row로 쿼리 추출 방법? [1]
strider
2015-12-23
8607
41037초보 개발자 쿼리 질문 좀 드릴게요 [3]
황수영
2015-12-22
8899
41036컬럼값 비교.. 도움부탁드려요!! [3]
꿈희
2015-12-22
9509
41035레프트 조인에서 서브쿼리 사용 방법 [2]
정재봉
2015-12-21
8897
41034COMMIT 명령 후 멈춤현상
크리리리
2015-12-18
8503
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.052초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다