postgresql 데이터를 일 월 년단위로 그룹화를 해서 조회하려고하니 잘안되네요 ㅠㅠㅠ 0 5 947

by 박규림 [DB 기타] POSTGRESQL [2021.03.19 11:55:00]


asda.PNG (23,023Bytes)

(SELECT 
        P.CUSTOMER_NAME,
         P.TRADE_DATE,
        '[월계]' AS PRODUCT_NAME ,
        '' AS STANDARD,
        SUM(PD.COUNT),
        0 AS PRODUCT_COST ,
        SUM(PD.SUPPLY_COST) AS SUPPLY_COST,
        SUM(PD.TAX_COST) AS TAX_COST,
        SUM(PD.SUPPLY_COST+PD.TAX_COST-PD.TOTAL_COST) AS DISCOUNT_COST,
        SUM(PD.TOTAL_COST) AS TOTAL_COST,
          0 AS DM_COST,
         SUM(PD.TOTAL_COST) AS BALANCE,
         '' AS BIGO
     FROM
         PURSALES P
     INNER JOIN PURSALES_DETAIL PD USING(MEMOFFICE_CD,PURSALES_CD)
     --INNER JOIN DEPOSIT_MANAGE D USING(MEMOFFICE_CD,CUS_CD,CUSTOMER_NAME)
     WHERE 1=1
          AND P.MEMOFFICE_CD = 'MN202100002' 
         AND P.PURSALES_TYPE='2'
         AND P.TRADE_DATE::date >= '2020-11-11'-- 시작일
         AND P.TRADE_DATE::date <= '2020-12-25'-- 끝일
        AND P.CUS_CD IN('CM202100003','CM202100004')
         --and P.TRADE_DATE BETWEEN '2020-11-11' AND '2020-12-25'
--          AND D.DM_TYPE = '1' 
--         AND D.DM_DATE::date >= '2020-10-01'-- 시작일
--         AND D.DM_DATE::date <= '2020-12-25'-- 종료일
     GROUP BY P.CUSTOMER_NAME,P.TRADE_DATE
    )

참고블로그들을 보니 

EXTRACT,
DATE_TRUNC 들을 쓰던데 제가 해보니 에러메세지: No function matches the given name and argument types. You might need to add explicit type casts.

저런 오류메세지만 뜨더라구요 ㅠ

첨부사진에 보시는것처럼 trade_date 의 한달마다 [월계]란 product_name이 들어가야하는데  날짜마다 들어갑니다.

도움을 좀 주십시오^^ 

by pajama [2021.03.19 12:39:19]

trade_date가 문자형이라 그런거 아닐까요? 날짜형이면 date_trunc, 문자형이면 substr으로 해도 되지 않을지

with t (customer_name, trade_date, cnt) as (
select '이안인테리어', '2020-11-11', 100 union all
select '이안인테리어', '2020-12-15', 80 union all
select '이안인테리어', '2020-12-16', 70 union all
select '엔젤인베스트먼트', '2020-11-11', 80 union all
select '엔젤인베스트먼트', '2020-12-15', 120 union all
select '엔젤인베스트먼트', '2020-12-16', 40
)
select customer_name, 
        date_trunc('month', trade_date::date), 
       '[월계]' product_name,
       sum(cnt)
from t 
group by customer_name, date_trunc('month', trade_date::date)

by 박규림 [2021.03.19 15:03:45]

감사합니다 파자마님 큰도움이 됫습니다.


by 마농 [2021.03.19 13:07:20]

1. 비교식은 비교하는 두값의 자료형이 일치해야 합니다.
- 문자컬럼엔 문자조건을 주고 날짜 컬럼엔 날짜 조건을 줘야 합니다.
- 그런데 조건 준거 보면 문자항목을 굳이 날짜로 변경한뒤에 결국 문자 조건을 주고 있네요.
- 변경전 : P.TRADE_DATE::date >= '2020-11-11'
- 변경후 : P.TRADE_DATE >= '2020-11-11'
2. 함수의 인자를 줄때도 필요한 타입에 맞도로 작성해야 합니다.
- date_trunc 함수는 날짜를 필요로 하니 날짜형으로 변환한 값을 입력해주면 될 것입니다.
- 그런데 굳이 문자를 날짜로 전환한뒤 날짜함수 쓰는 것 보다는
- 그냥 문자를 잘라서 쓰는게 나을 듯 하네요. SUBSTR(p.trade_date, 1, 7)
3. 전체 쿼리가 아닌 쿼리의 일부분 인 듯 합니다.
- 혹시 일별, 월별, 연별 각각 쿼리하여 UNION ALL 하는 것이라면?
- 한번에 구하는 방안을 생각해 보세요.
- ROLLUP 등을 이용할 수 있습니다.


by 박규림 [2021.03.19 15:08:08]

감사합니다 마농님 알기쉽게 설명 해주셔서 감사합니다. 말씀해주신대로 저부분은 제가 짠 쿼리의 일부분이고 

유니온의 일부분입니다. 그리고 말씀해주신대로 ROLLUP함수를 먼저 찾아보고 써봣는데 지식이 좀 부족해서그런지

원하는대로 잘안나오더라구요, 원하는 조회결과목적이 한컬럼을 전부 더하고 그룹화하는 ROLLUP이 아니라 한컬럼에서도

몇몇부분만 그룹화하고 또 몇몇부분만 그룹화해서 중간에 로우를 끼워넣는걸 원해서 롤업은 제가 잘못써서 그런지 원하는대로안나오더라구용 그래서 말씀해주신 날짜함수에 문자타입을 자꾸넣고 조건에 문자를 괜히 날짜형으로 바꿔서 조건을써서 그렇더라구요. 도움정말감사드립니다.^^ 


by 박규림 [2021.03.19 15:03:22]

답변채택이 한분밖에 안되네요 ㅠㅠ 두분답변 모두 도움이 됬습니다. 마농님도 정말 감사합니다!^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입