첫 구매 부서 중 고객수 0 7 1,581

by jsbj [SQL Query] [2022.06.20 15:01:58]


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사업부 첫구매 고객 중 타 다른사업부 교차구매 고객 수"를 어떻게 구해야 하나요?

by 마농 [2022.06.20 15:31:39]

ymd 와 ord_dt 가 다른 항목인지? 혹시 같은 항목 아닌지?
2021년도 조건을 적용한 문장으로 문제를 바꾸어 주세요.
교차구매의 의미가 뭔지 모르겠습니다.
모호한 표현을 명확하게 고쳐주세요.


by jsbj [2022.06.20 15:42:51]

ymd 는 주문일자랑 다르게 단순 조회 기간입니다. 

교차구매는 1사업부를 최초로 구매한 사람이 2,3,4사업부에서도 구매한 의미 입니다. 

조건은 1사업부에서 최초 구매한 사람이면서 2,3,4사업부에서 구매한 사람이 있으면 count 구하는 겁니다.


by 마농 [2022.06.20 16:25:45]

ymd 가 구매일이 아니면 어떤 의미의 일자인가요?
ymd 조건은 각각(사업부별) 어떻게 적용되나요?


by jsbj [2022.06.20 17:01:02]

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사업부'
;

 

일자 하나(정산일자)로 통일 했습니다. 


by 장독깨기 [2022.06.20 17:46:44]
의미가 조금 모호하긴 하지만, 대략 이런 식으로 하면 되지 않을까요.
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

 


by jsbj [2022.06.20 19:12:53]

감사합니다~ 쿼리가 약해서... ㅠㅠ

 


by 마농 [2022.06.22 13:56:01]
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%'
        )
;

 

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