SELECT COUNT(DISTINCT CUST_ID)
from(
SELECT
CUST_ID
,ORD_DT
,ORD_NO
,YMD
,사업부
,DENSE_RANK() OVER(PARTITION BY CUST_ID ORDER BY ORD_DT , ORD_NO) AS 순서
FROM table
GROUP BY CUST_ID, ORD_DT, ORD_NO, YMD, 사업부
) A
WHERE 1=1
AND 순서= 1
AND YMD BETWEEN '20210101' AND '20211231'
AND 사업부 = '1사업부'
;
여기서 사업부가 1인 첫 구매고객 수를 구했는데요.
문제는 "1사업부 첫구매 고객 중 타 다른사업부 교차구매 고객 수"를 어떻게 구해야 하나요?
ymd 와 ord_dt 가 다른 항목인지? 혹시 같은 항목 아닌지?
2021년도 조건을 적용한 문장으로 문제를 바꾸어 주세요.
교차구매의 의미가 뭔지 모르겠습니다.
모호한 표현을 명확하게 고쳐주세요.
ymd 는 주문일자랑 다르게 단순 조회 기간입니다.
교차구매는 1사업부를 최초로 구매한 사람이 2,3,4사업부에서도 구매한 의미 입니다.
조건은 1사업부에서 최초 구매한 사람이면서 2,3,4사업부에서 구매한 사람이 있으면 count 구하는 겁니다.
SELECT COUNT(DISTINCT CUST_ID)
from(
SELECT
CUST_ID
,ORD_NO
,YMD
,사업부
,DENSE_RANK() OVER(PARTITION BY CUST_ID ORDER BY YMD , ORD_NO) AS 순서
FROM table
GROUP BY CUST_ID, ORD_NO, YMD, 사업부
) A
WHERE 1=1
AND 순서= 1
AND YMD BETWEEN '20210101' AND '20211231'
AND 사업부 = '1사업부'
;
일자 하나(정산일자)로 통일 했습니다.
ymd 가 구매일이 아니면 어떤 의미의 일자인가요?
ymd 조건은 각각(사업부별) 어떻게 적용되나요?
의미가 조금 모호하긴 하지만, 대략 이런 식으로 하면 되지 않을까요.
select distinct cust_id from ( select cust_id from ( select cust_id, ymd, rank() over (partition by cust_id order by ymd) 순서 from table where 사업부 = 1 ) where 순서 = 1 and ymd between '20210101' and '20211231' ) a, ( select distinct cust_id from table where 사업부 in (2,3,4) ) b where a.cust_id = b.cust_id
감사합니다~ 쿼리가 약해서... ㅠㅠ
SELECT COUNT(*) cnt_1
, COUNT(CASE WHEN cnt > 1 THEN 1 END) cnt_2
FROM (SELECT cust_id
, COUNT(DISTINCT 사업부) cnt
FROM table
GROUP BY cust_id
HAVING MIN(사업부) KEEP(DENSE_RANK FIRST ORDER BY ord_dt, ord_no) = '1사업부'
AND MIN(ymd) KEEP(DENSE_RANK FIRST ORDER BY ord_dt, ord_no) LIKE '2021%'
)
;