by 박규림 [DB 기타] POSTGRESQL [2021.03.19 11:55:00]
(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이 들어가야하는데 날짜마다 들어갑니다.
도움을 좀 주십시오^^
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)
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 등을 이용할 수 있습니다.
감사합니다 마농님 알기쉽게 설명 해주셔서 감사합니다. 말씀해주신대로 저부분은 제가 짠 쿼리의 일부분이고
유니온의 일부분입니다. 그리고 말씀해주신대로 ROLLUP함수를 먼저 찾아보고 써봣는데 지식이 좀 부족해서그런지
원하는대로 잘안나오더라구요, 원하는 조회결과목적이 한컬럼을 전부 더하고 그룹화하는 ROLLUP이 아니라 한컬럼에서도
몇몇부분만 그룹화하고 또 몇몇부분만 그룹화해서 중간에 로우를 끼워넣는걸 원해서 롤업은 제가 잘못써서 그런지 원하는대로안나오더라구용 그래서 말씀해주신 날짜함수에 문자타입을 자꾸넣고 조건에 문자를 괜히 날짜형으로 바꿔서 조건을써서 그렇더라구요. 도움정말감사드립니다.^^