Просмотр исходного кода

Merge remote-tracking branch 'origin/develop' into jsh77b

jsh77b 4 лет назад
Родитель
Сommit
bf469bd22d

+ 11 - 0
src/main/java/com/style24/batch/biz/dao/TsbStatisticsDao.java

@@ -94,4 +94,15 @@ public interface TsbStatisticsDao {
 	 */
 	void updateSalesUploadResult(Map<String, Object> paramMap);
 
+	int createStatCustAll(String currDay);
+
+	int createStatCustDorm(String currDay);
+
+	int createStatCustExt(String currDay);
+
+	int createStatCustJoin(String currDay);
+
+	int createStatCust(String currDay);
+
+	int createStatCustOrd(String currDay);
 }

+ 62 - 0
src/main/java/com/style24/batch/biz/job/statistics/TsbCustOrderStaticsJob.java

@@ -0,0 +1,62 @@
+package com.style24.batch.biz.job.statistics;
+
+import com.gagaframework.web.util.GagaDateUtil;
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbStatisticsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 회원통계
+ *
+ * @author swkim
+ * @since 2021.05.17
+ */
+@Component
+@Slf4j
+public class TsbCustOrderStaticsJob extends TsbAbstractJob<String, String, String> {
+
+	@Autowired
+	private TsbStatisticsService statisticsService;
+
+	@Override
+	public String read() throws Exception {
+		return "OK";
+	}
+
+	@Override
+	public String process(String result) throws Exception {
+
+		// 기간
+		/*String startDay = "20210701";
+		String endDay = "20210831";
+		int days = GagaDateUtil.getOffsetDays(endDay, startDay) + 1;
+
+		System.out.println("term === " + days);
+
+		for (int i=0; i<days; i++) {
+			String currDay = GagaDateUtil.getOffsetDate(startDay, i, "yyyyMMdd");
+			System.out.println(currDay);
+
+			statisticsService.createStatCustOrd(currDay);
+		}*/
+
+		String toDay = GagaDateUtil.getToday();
+		String currDay = GagaDateUtil.getOffsetDate(toDay, -1, "yyyyMMdd");
+
+		statisticsService.createStatCustOrd(currDay);
+
+		return result;
+	}
+
+	@Override
+	public String write(String result) throws Exception {
+		return result;
+	}
+
+	@Override
+	public void notify(String result) throws Exception {
+		// Do nothing
+	}
+}

+ 62 - 0
src/main/java/com/style24/batch/biz/job/statistics/TsbCustStaticsJob.java

@@ -0,0 +1,62 @@
+package com.style24.batch.biz.job.statistics;
+
+import com.gagaframework.web.util.GagaDateUtil;
+import com.style24.batch.biz.job.TsbAbstractJob;
+import com.style24.batch.biz.service.TsbStatisticsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 회원통계
+ *
+ * @author swkim
+ * @since 2021.05.17
+ */
+@Component
+@Slf4j
+public class TsbCustStaticsJob extends TsbAbstractJob<String, String, String> {
+
+	@Autowired
+	private TsbStatisticsService statisticsService;
+
+	@Override
+	public String read() throws Exception {
+		return "OK";
+	}
+
+	@Override
+	public String process(String result) throws Exception {
+
+		// 기간
+		/*String startDay = "20210901";
+		String endDay = "20210925";
+		int days = GagaDateUtil.getOffsetDays(endDay, startDay) + 1;
+
+		System.out.println("term === " + days);
+
+		for (int i=0; i<days; i++) {
+			String currDay = GagaDateUtil.getOffsetDate(startDay, i, "yyyyMMdd");
+			System.out.println(currDay);
+
+			statisticsService.createStatCust(currDay);
+		}*/
+
+		String toDay = GagaDateUtil.getToday();
+		String currDay = GagaDateUtil.getOffsetDate(toDay, -1, "yyyyMMdd");
+
+		statisticsService.createStatCust(currDay);
+
+		return result;
+	}
+
+	@Override
+	public String write(String result) throws Exception {
+		return result;
+	}
+
+	@Override
+	public void notify(String result) throws Exception {
+		// Do nothing
+	}
+}

+ 2 - 2
src/main/java/com/style24/batch/biz/job/statistics/TsbPayStaticsJob.java

@@ -29,8 +29,8 @@ public class TsbPayStaticsJob extends TsbAbstractJob<String, String, String> {
 	public String process(String result) throws Exception {
 
 		// 기간
-		/*String startDay = "20180701";
-		String endDay = "20210915";
+		/*String startDay = "20180101";
+		String endDay = "20210925";
 		int days = GagaDateUtil.getOffsetDays(endDay, startDay) + 1;
 
 		System.out.println("term === " + days);

+ 2 - 2
src/main/java/com/style24/batch/biz/job/statistics/TsbSubPayStaticsJob.java

@@ -29,8 +29,8 @@ public class TsbSubPayStaticsJob extends TsbAbstractJob<String, String, String>
 	public String process(String result) throws Exception {
 
 		// 기간
-		/*String startDay = "20180701";
-		String endDay = "20210915";
+		/*String startDay = "20180101";
+		String endDay = "20210925";
 		int days = GagaDateUtil.getOffsetDays(endDay, startDay) + 1;
 
 		System.out.println("days === " + days);

+ 13 - 0
src/main/java/com/style24/batch/biz/service/TsbStatisticsService.java

@@ -165,4 +165,17 @@ public class TsbStatisticsService {
 		}
 	}
 
+	@Transactional("shopTxnManager")
+	public void createStatCust(String currDay) {
+		statisticsDao.createStatCustAll(currDay);
+		statisticsDao.createStatCustDorm(currDay);
+		statisticsDao.createStatCustExt(currDay);
+		statisticsDao.createStatCustJoin(currDay);
+		statisticsDao.createStatCust(currDay);
+	}
+
+	@Transactional("shopTxnManager")
+	public void createStatCustOrd(String currDay) {
+		statisticsDao.createStatCustOrd(currDay);
+	}
 }

+ 29 - 10
src/main/java/com/style24/batch/biz/task/TsbStatisticsTask.java

@@ -1,19 +1,11 @@
 package com.style24.batch.biz.task;
 
+import com.style24.batch.biz.job.statistics.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import com.style24.batch.biz.job.statistics.TsbDateTimeOrderStaticsJob;
-import com.style24.batch.biz.job.statistics.TsbDayOrderStaticsJob;
-import com.style24.batch.biz.job.statistics.TsbInflowStatisticsJob;
-import com.style24.batch.biz.job.statistics.TsbInflowYesterdayStatisticsJob;
-import com.style24.batch.biz.job.statistics.TsbPayStaticsJob;
-import com.style24.batch.biz.job.statistics.TsbSalesSmsSendJob;
-import com.style24.batch.biz.job.statistics.TsbSalesUploadJob;
-import com.style24.batch.biz.job.statistics.TsbSubPayStaticsJob;
-
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -49,6 +41,12 @@ public class TsbStatisticsTask {
 	@Autowired
 	private TsbSalesUploadJob salesUploadJob;
 
+	@Autowired
+	private TsbCustStaticsJob custStaticsJob;
+
+	@Autowired
+	private TsbCustOrderStaticsJob custOrderStaticsJob;
+
 	/**
 	 * 초 분 시 일 월 주(년)
 	 * 0 0 12 * * ?" : 아무 요일, 매월, 매일 12:00:00
@@ -134,7 +132,7 @@ public class TsbStatisticsTask {
 	@Async
 	public void subPayStaticsJob() throws Exception {
 		//subPayStaticsJob.run("subPayStaticsJob");
-		payStaticsJob.runById("cron.statistics.pay.sub.create");
+		subPayStaticsJob.runById("cron.statistics.pay.sub.create");
 	}
 
 	/**
@@ -166,4 +164,25 @@ public class TsbStatisticsTask {
 		salesUploadJob.runById("cron.statistics.sales.upload");
 	}
 
+	/**
+	 * 회원통계
+	 */
+	//@Scheduled(fixedDelay = 999999999)
+	@Scheduled(cron = "${cron.statistics.customer.create}")
+	@Async
+	public void custStaticsJob() throws Exception {
+		//custStaticsJob.run("custStaticsJob");
+		custStaticsJob.runById("cron.statistics.customer.create");
+	}
+
+	/**
+	 * 회원주문통계
+	 */
+	//@Scheduled(fixedDelay = 999999999)
+	@Scheduled(cron = "${cron.statistics.customer.order.create}")
+	@Async
+	public void custOrderStaticsJob() throws Exception {
+		//custOrderStaticsJob.run("custOrderStaticsJob");
+		custOrderStaticsJob.runById("cron.statistics.customer.order.create");
+	}
 }

+ 552 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsbStatistics.xml

@@ -1127,4 +1127,556 @@
 		AND    CD_SIZE = #{CD_SIZE}
 	</update>
 
+	<!-- 전체회원 -->
+	<insert id="createStatCustAll" parameterType="String" timeout="6000">
+		/* TsbStatistics.createStatCustAll */
+		INSERT INTO TB_STAT_CUST_ALL (DAY, SEX_GB, AGE, CUST_STAT, CUST_GRADE, CUST_CNT)
+		SELECT
+			DATE_FORMAT(#{currDay},'%Y-%m-%d') AS DAY
+			, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+			, CASE WHEN FN_DEC_AES(BIRTH_YMD) = '' OR FN_DEC_AES(BIRTH_YMD) IS NULL THEN 'X'
+			WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+			WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+			WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+			WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+			ELSE 'X' END                                                  AS AGE
+			, CUST_STAT
+			, CUST_GRADE
+			, COUNT(1) AS CNT
+		FROM TB_CUSTOMER
+		WHERE CUST_NO > 0
+			AND JOIN_DT >= DATE_FORMAT('20060101', '%Y%m%d')
+			AND JOIN_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+		GROUP BY DAY, SEX_GB, AGE, CUST_STAT, CUST_GRADE
+	</insert>
+
+	<!-- 전체휴면회원 -->
+	<insert id="createStatCustDorm" parameterType="String" timeout="6000">
+		/* TsbStatistics.createStatCustDorm */
+		INSERT INTO TB_STAT_CUST_DORM (DAY, SEX_GB, AGE, CUST_CNT)
+		SELECT
+			DAY
+			, SEX_GB
+			, AGE
+			, SUM(CNT) AS CNT
+		FROM (
+			SELECT
+				DATE_FORMAT(DORMANT_DT,'%Y-%m-%d') AS DAY
+				, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+				, CASE WHEN FN_DEC_AES(BIRTH_YMD) = '' OR FN_DEC_AES(BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+				ELSE 'X' END                                                  AS AGE
+				, COUNT(1) AS CNT
+			FROM TB_DORMANT_CUST
+			WHERE CUST_NO > 0
+				AND DORMANT_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+				AND DORMANT_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+			GROUP BY DAY, SEX_GB, AGE
+			UNION ALL
+			SELECT
+				DATE_FORMAT(RM_DORMANT_DT,'%Y-%m-%d') AS DAY
+				, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+				, CASE WHEN FN_DEC_AES(BIRTH_YMD) = '' OR FN_DEC_AES(BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+				ELSE 'X' END                                                  AS AGE
+				, COUNT(1) * -1 AS CNT
+			FROM TB_CUSTOMER
+			WHERE CUST_NO > 0
+				AND RM_DORMANT_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+				AND RM_DORMANT_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+			GROUP BY DAY, SEX_GB, AGE
+			UNION ALL
+			SELECT
+				DATE_FORMAT(#{currDay}, '%Y-%m-%d') AS DAY
+				, SEX_GB
+				, AGE
+				,SUM(DORM_CNT) AS CNT
+			FROM TB_STAT_CUST
+			WHERE DAY = DATE_ADD(DATE_FORMAT(#{currDay}, '%Y%m%d'), INTERVAL -1 DAY)
+			GROUP BY DAY, SEX_GB, AGE
+		) Z
+		GROUP BY DAY, SEX_GB, AGE
+	</insert>
+
+	<!-- 휴면탈퇴회원 -->
+	<insert id="createStatCustExt" parameterType="String" timeout="6000">
+		/* TsbStatistics.createStatCustExt */
+		INSERT INTO TB_STAT_CUST_EXT (DAY, SEX_GB, AGE, GB, CUST_CNT)
+		SELECT
+			DATE_FORMAT(DORMANT_DT,'%Y-%m-%d') AS DAY
+			, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+			, CASE WHEN FN_DEC_AES(BIRTH_YMD) = '' OR FN_DEC_AES(BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+			ELSE 'X' END                                                  AS AGE
+			, 'A' AS GB
+			, COUNT(1) AS CNT
+		FROM TB_DORMANT_CUST
+		WHERE CUST_NO > 0
+			AND DORMANT_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+			AND DORMANT_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+		GROUP BY DAY, SEX_GB, AGE
+		UNION ALL
+		SELECT
+			DATE_FORMAT(RM_DORMANT_DT,'%Y-%m-%d') AS DAY
+			, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+			, CASE WHEN FN_DEC_AES(BIRTH_YMD) = '' OR FN_DEC_AES(BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+			ELSE 'X' END                                                  AS AGE
+			, 'B' AS GB
+			, COUNT(1) AS CNT
+		FROM TB_CUSTOMER
+		WHERE CUST_NO > 0
+			AND RM_DORMANT_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+			AND RM_DORMANT_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+		GROUP BY DAY, SEX_GB, AGE
+		UNION ALL
+		SELECT
+			DATE_FORMAT(SECEDE_DT,'%Y-%m-%d') AS DAY
+			, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+			, CASE WHEN FN_DEC_AES(BIRTH_YMD) = '' OR FN_DEC_AES(BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+			ELSE 'X' END                                                  AS AGE
+			, 'C' AS GB
+			, COUNT(1) AS CNT
+		FROM TB_SECEDE_CUST A
+		WHERE CUST_NO > 0
+		AND SECEDE_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+		AND SECEDE_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+		GROUP BY DAY, SEX_GB, AGE
+	</insert>
+
+	<!-- 가입회원 -->
+	<insert id="createStatCustJoin" parameterType="String" timeout="6000">
+		/* TsbStatistics.createStatCustJoin */
+		INSERT INTO TB_STAT_CUST_JOIN (DAY, SEX_GB, AGE, DIRECT_YN, CUST_CNT)
+		SELECT
+			DATE_FORMAT(JOIN_DT,'%Y-%m-%d') AS DAY
+			, IFNULL(FN_DEC_AES(SEX_GB), 'G007_X') AS SEX_GB
+			, CASE WHEN FN_DEC_AES(BIRTH_YMD) = '' OR FN_DEC_AES(BIRTH_YMD) IS NULL THEN 'X'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+				WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+			ELSE 'X' END                                                  AS AGE
+			, CASE WHEN (SELECT COUNT(1) FROM TB_AF_LINK X WHERE X.AF_LINK_CD = A.AF_LINK_CD AND X.AF_CHANNEL = 'G053_01') > 0 THEN 'Y' ELSE 'N' END AS DIRECT_YN
+			, COUNT(1) AS CNT
+		FROM TB_CUSTOMER A
+		WHERE CUST_NO > 0
+		AND JOIN_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')
+		AND JOIN_DT &lt;= DATE_FORMAT(CONCAT(#{currDay},'235959'), '%Y%m%d%h%i%s')
+		GROUP BY DAY, SEX_GB, AGE, DIRECT_YN
+	</insert>
+
+	<!-- 회원통계 -->
+	<insert id="createStatCust" parameterType="String" timeout="6000">
+		/* TsbStatistics.createStatCust */
+		INSERT INTO TB_STAT_CUST (DAY, SEX_GB, AGE, ALL_CNT, REAL_CNT, DORM_CNT, VIP_CNT, GOLD_CNT, SILVER_CNT, BRONZE_CNT, WELCOME_CNT, JOIN_CNT, DR_JOIN_CNT, AF_JOIN_CNT, CHG_DORM_CNT, RM_DORM_CNT, SECEED_CNT)
+		SELECT
+			DAY
+			 , SEX_GB
+			 , AGE
+			 , IFNULL(SUM(CASE WHEN GB = '1' THEN CUST_CNT ELSE 0 END), 0) AS ALL_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '2' THEN CUST_CNT ELSE 0 END), 0) AS REAL_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '3' THEN CUST_CNT ELSE 0 END), 0) AS DORM_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '4' THEN CUST_CNT ELSE 0 END), 0) AS VIP_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '5' THEN CUST_CNT ELSE 0 END), 0) AS GOLD_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '6' THEN CUST_CNT ELSE 0 END), 0) AS SILVER_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '7' THEN CUST_CNT ELSE 0 END), 0) AS BRONZE_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '8' THEN CUST_CNT ELSE 0 END), 0) AS WELCOME_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '9' THEN CUST_CNT ELSE 0 END), 0) AS JOIN_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '10' THEN CUST_CNT ELSE 0 END), 0) AS DR_JOIN_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '11' THEN CUST_CNT ELSE 0 END), 0) AS AF_JOIN_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '12' THEN CUST_CNT ELSE 0 END), 0) AS CHG_DORM_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '13' THEN CUST_CNT ELSE 0 END), 0) AS RM_DORM_CNT
+			 , IFNULL(SUM(CASE WHEN GB = '14' THEN CUST_CNT ELSE 0 END), 0) AS SECEED_CNT
+		FROM (
+				 -- 전체회원
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '1'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 실회원
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '2'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 휴면회원
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '3'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_DORM
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- VIP
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '4'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				   AND CUST_GRADE = 'G110_10'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- GOLD
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '5'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				   AND CUST_GRADE = 'G110_20'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- SILVER
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '6'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				   AND CUST_GRADE = 'G110_30'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- BRONZE
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '7'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				   AND CUST_GRADE = 'G110_40'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- WELCOME
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '8'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_ALL
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND CUST_STAT = 'G104_10'
+				   AND CUST_GRADE = 'G110_50'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 가입수
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '9'                          AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_JOIN
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 직방문가입수
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '10'                         AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_JOIN
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND DIRECT_YN = 'Y'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 제휴가입수
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '11'                         AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_JOIN
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND DIRECT_YN = 'N'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 휴면전환
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '12'                         AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_EXT
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND GB = 'A'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 휴면해제
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '13'                         AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_EXT
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND GB = 'B'
+				 GROUP BY DAY, SEX_GB, AGE
+				 UNION ALL
+				 -- 탈퇴
+				 SELECT DATE_FORMAT(DAY, '%Y-%m-%d') AS DAY
+					  , '14'                         AS GB
+					  , SEX_GB
+					  , AGE
+					  , SUM(CUST_CNT)                AS CUST_CNT
+				 FROM TB_STAT_CUST_EXT
+				 WHERE DAY = DATE_FORMAT(#{currDay}, '%Y-%m-%d')
+				   AND GB = 'C'
+				 GROUP BY DAY, SEX_GB, AGE
+			 ) Z
+		GROUP BY DAY, SEX_GB, AGE
+	</insert>
+
+	<!-- 회원주문통계 -->
+	<insert id="createStatCustOrd" parameterType="String" timeout="600">
+		/* TsbStatistics.createStatCustOrd */
+		INSERT INTO TB_STAT_CUST_ORD (DAY, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE, SELL_QTY, ORD_AMT, CNCL_QTY, RTN_QTY, CNCL_AMT, RTN_AMT, ORD_CNT)
+		WITH TAB AS (
+			SELECT *
+			FROM (
+				SELECT A.ORD_NO
+					, B.ORD_DTL_NO
+					, B.ORD_QTY
+					, B.CNCL_RTN_QTY
+					, B.ORD_AMT
+					, B.CNCL_RTN_AMT
+					, B.CPN1_DC_AMT
+					, A.PAY_DT
+					, A.FRONT_GB
+					, C.ITEMKIND_CD
+					, C.BRAND_CD
+					, IFNULL(FN_DEC_AES(E.SEX_GB), 'G007_X')                            AS SEX_GB
+					, CASE WHEN FN_DEC_AES(E.BIRTH_YMD) = '' OR FN_DEC_AES(E.BIRTH_YMD) IS NULL THEN 'X'
+						WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(E.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+						WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(E.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+						WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(E.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+						WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(E.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+					ELSE 'X' END                                                  AS AGE
+					, E.CUST_NO
+					, E.CUST_GRADE
+					, RANK() OVER (PARTITION BY B.ORD_DTL_NO ORDER BY B.ORD_DTL_HST_SQ) AS RNK
+				FROM TB_ORDER A,
+					TB_ORDER_DETAIL_HST B,
+					TB_GOODS C,
+					TB_CUSTOMER E
+				WHERE A.ORD_NO = B.ORD_NO
+					AND B.GOODS_CD = C.GOODS_CD
+					AND A.CUST_NO = E.CUST_NO
+					AND A.PAY_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d')                         -- 시작일변수
+					AND A.PAY_DT &lt;= DATE_FORMAT(CONCAT(#{currDay}, '235959'), '%Y%m%d%H%i%s') -- 종료일변수
+					AND A.MALL_GB = 'G011_10'
+					AND B.ORD_EXCH_GB = 'O'
+					AND B.ORD_DTL_STAT = 'G013_20' -- 결제완료
+				) A
+				WHERE RNK = 1
+		)
+		-- 판매수
+		, TAB_SELL_QTY AS (
+			SELECT
+				DATE_FORMAT(PAY_DT, '%Y-%m-%d') AS TERM
+				, SUM(ORD_QTY) AS VAL
+				, '1' AS GBN
+				, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+			FROM TAB
+			GROUP BY TERM, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 매출
+		, TAB_ORD AS (
+			SELECT
+				DATE_FORMAT(PAY_DT, '%Y-%m-%d') AS TERM
+				, SUM(ORD_AMT + CPN1_DC_AMT + (SELECT SUM(OPT_ADD_PRICE * ITEM_QTY) FROM TB_ORDER_DETAIL_ITEM X WHERE X.ORD_DTL_NO = A.ORD_DTL_NO)) AS VAL
+				, '2' AS GBN
+				, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+			FROM TAB A
+			GROUP BY TERM, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 취소갯수
+		, TAB_CNCL_QTY AS (
+			SELECT DATE_FORMAT(COMPLETE_DT, '%Y-%m-%d') AS TERM
+				, SUM(CHG_QTY) AS VAL
+				, '3' AS GBN
+				, C.FRONT_GB, BRAND_CD, ITEMKIND_CD
+				, IFNULL(FN_DEC_AES(G.SEX_GB), 'G007_X') AS SEX_GB
+				, CASE WHEN FN_DEC_AES(G.BIRTH_YMD) = '' OR FN_DEC_AES(G.BIRTH_YMD) IS NULL THEN 'X'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+				ELSE 'X' END                                                  AS AGE
+				, CUST_GRADE
+			FROM TB_ORDER_CHANGE_DETAIL A, TB_ORDER_DETAIL B, TB_ORDER C, TB_GOODS E, TB_CUSTOMER G
+			WHERE A.ORD_DTL_NO = B.ORD_DTL_NO
+				AND B.ORD_NO = C.ORD_NO
+				AND B.GOODS_CD = E.GOODS_CD
+				AND C.CUST_NO = G.CUST_NO
+				AND CHG_STAT = 'G685_18' -- 결제후취소
+				AND COMPLETE_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d') -- 시작일변수
+				AND COMPLETE_DT &lt;= DATE_FORMAT(CONCAT(#{currDay}, '235959'), '%Y%m%d%H%i%s') -- 종료일변수
+				AND MALL_GB = 'G011_10'
+			GROUP BY TERM, C.FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 반품갯수
+		, TAB_RTN_QTY AS (
+			SELECT DATE_FORMAT(COMPLETE_DT, '%Y-%m-%d') AS TERM
+				, SUM(CHG_QTY) AS VAL
+				, '4' AS GBN
+				, C.FRONT_GB, BRAND_CD, ITEMKIND_CD
+				, IFNULL(FN_DEC_AES(G.SEX_GB), 'G007_X') AS SEX_GB
+				, CASE WHEN FN_DEC_AES(G.BIRTH_YMD) = '' OR FN_DEC_AES(G.BIRTH_YMD) IS NULL THEN 'X'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+				ELSE 'X' END                                                  AS AGE
+				, CUST_GRADE
+			FROM TB_ORDER_CHANGE_DETAIL A, TB_ORDER_DETAIL B, TB_ORDER C, TB_GOODS E, TB_CUSTOMER G
+			WHERE A.ORD_DTL_NO = B.ORD_DTL_NO
+				AND B.ORD_NO = C.ORD_NO
+				AND B.GOODS_CD = E.GOODS_CD
+				AND C.CUST_NO = G.CUST_NO
+				AND CHG_STAT = 'G685_60' -- 반품완료
+				AND COMPLETE_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d') -- 시작일변수
+				AND COMPLETE_DT &lt;= DATE_FORMAT(CONCAT(#{currDay}, '235959'), '%Y%m%d%H%i%s') -- 종료일변수
+				AND MALL_GB = 'G011_10'
+			GROUP BY TERM, C.FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 취소액
+		, TAB_CNCL_AMT AS (
+			SELECT DATE_FORMAT(COMPLETE_DT, '%Y-%m-%d') AS TERM
+				, SUM((C.CURR_PRICE + (SELECT SUM(OPT_ADD_PRICE * ITEM_QTY) FROM TB_ORDER_DETAIL_ITEM X WHERE X.ORD_DTL_NO = C.ORD_DTL_NO)) * B.CHG_QTY) AS VAL
+				, '5' AS GBN
+				, D.FRONT_GB, BRAND_CD, ITEMKIND_CD
+				, IFNULL(FN_DEC_AES(G.SEX_GB), 'G007_X') AS SEX_GB
+				, CASE WHEN FN_DEC_AES(G.BIRTH_YMD) = '' OR FN_DEC_AES(G.BIRTH_YMD) IS NULL THEN 'X'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+				ELSE 'X' END                                                  AS AGE
+				, CUST_GRADE
+			FROM TB_ORDER_CHANGE_DETAIL B, TB_ORDER_DETAIL C, TB_ORDER D, TB_GOODS E, TB_CUSTOMER G
+			WHERE B.ORD_DTL_NO = C.ORD_DTL_NO
+				AND C.ORD_NO = D.ORD_NO
+				AND C.GOODS_CD = E.GOODS_CD
+				AND D.CUST_NO = G.CUST_NO
+				AND CHG_STAT = 'G685_18' -- 결제후취소
+				AND B.COMPLETE_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d') -- 시작일변수
+				AND B.COMPLETE_DT &lt;= DATE_FORMAT(CONCAT(#{currDay}, '235959'), '%Y%m%d%H%i%s') -- 종료일변수
+				AND MALL_GB = 'G011_10'
+			GROUP BY TERM, D.FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 반품액
+		, TAB_RTN_AMT AS (
+			SELECT DATE_FORMAT(COMPLETE_DT, '%Y-%m-%d') AS TERM
+				, SUM((C.CURR_PRICE + (SELECT SUM(OPT_ADD_PRICE * ITEM_QTY) FROM TB_ORDER_DETAIL_ITEM X WHERE X.ORD_DTL_NO = C.ORD_DTL_NO)) * B.CHG_QTY) AS VAL
+				, '6' AS GBN
+				, D.FRONT_GB, BRAND_CD, ITEMKIND_CD
+				, IFNULL(FN_DEC_AES(G.SEX_GB), 'G007_X') AS SEX_GB
+				, CASE WHEN FN_DEC_AES(G.BIRTH_YMD) = '' OR FN_DEC_AES(G.BIRTH_YMD) IS NULL THEN 'X'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 10 AND 19 THEN '10'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 20 AND 29 THEN '20'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 30 AND 39 THEN '30'
+					WHEN (DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(CONCAT(SUBSTRING(FN_DEC_AES(G.BIRTH_YMD), 1, 4), '0101'), '%Y') + 1) BETWEEN 40 AND 49 THEN '40'
+				ELSE 'X' END                                                  AS AGE
+				, CUST_GRADE
+			FROM TB_ORDER_CHANGE_DETAIL B, TB_ORDER_DETAIL C, TB_ORDER D, TB_GOODS E, TB_CUSTOMER G
+			WHERE B.ORD_DTL_NO = C.ORD_DTL_NO
+				AND C.ORD_NO = D.ORD_NO
+				AND C.GOODS_CD = E.GOODS_CD
+				AND D.CUST_NO = G.CUST_NO
+				AND CHG_STAT = 'G685_60' -- 반품완료
+				AND B.COMPLETE_DT >= DATE_FORMAT(#{currDay}, '%Y%m%d') -- 시작일변수
+				AND B.COMPLETE_DT &lt;= DATE_FORMAT(CONCAT(#{currDay}, '235959'), '%Y%m%d%H%i%s') -- 종료일변수
+				AND MALL_GB = 'G011_10'
+			GROUP BY TERM, D.FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		-- 주문수
+		, TAB_ORD_CNT AS (
+			SELECT
+				TERM
+				, SUM(VAL) AS VAL
+				, '7' AS GBN
+				, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+			FROM (
+				SELECT
+					DATE_FORMAT(PAY_DT, '%Y-%m-%d') AS TERM
+					, 1 AS VAL
+					, ORD_NO
+					, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+				FROM TAB
+				GROUP BY TERM, ORD_NO, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+			) A
+			GROUP BY TERM, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		)
+		SELECT
+			TERM
+			, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+			, SELL_QTY, ORD_AMT, CNCL_QTY, RTN_QTY, CNCL_AMT, RTN_AMT
+			, ORD_CNT
+		FROM (
+			SELECT
+				TERM
+				, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+				, SUM(CASE WHEN GBN = '1' THEN VAL ELSE 0 END) AS SELL_QTY -- 판매수
+				, SUM(CASE WHEN GBN = '2' THEN VAL ELSE 0 END) AS ORD_AMT -- 매출액(판매금액)
+				, SUM(CASE WHEN GBN = '3' THEN VAL ELSE 0 END) AS CNCL_QTY -- 취소수량
+				, SUM(CASE WHEN GBN = '4' THEN VAL ELSE 0 END) AS RTN_QTY -- 반품수량
+				, SUM(CASE WHEN GBN = '5' THEN VAL ELSE 0 END) AS CNCL_AMT -- 취소금액
+				, SUM(CASE WHEN GBN = '6' THEN VAL ELSE 0 END) AS RTN_AMT -- 반품금액
+				, SUM(CASE WHEN GBN = '7' THEN VAL ELSE 0 END) AS ORD_CNT -- 주문수
+			FROM (
+				SELECT * FROM TAB_SELL_QTY
+				UNION ALL
+				SELECT * FROM TAB_ORD
+				UNION ALL
+				SELECT * FROM TAB_CNCL_QTY
+				UNION ALL
+				SELECT * FROM TAB_RTN_QTY
+				UNION ALL
+				SELECT * FROM TAB_CNCL_AMT
+				UNION ALL
+				SELECT * FROM TAB_RTN_AMT
+				UNION ALL
+				SELECT * FROM TAB_ORD_CNT
+			) A
+			GROUP BY TERM, FRONT_GB, BRAND_CD, ITEMKIND_CD, SEX_GB, AGE, CUST_GRADE
+		) X
+	</insert>
 </mapper>

+ 2 - 0
src/main/resources/config/application-locd.yml

@@ -158,6 +158,8 @@ cron:
         sales.sms.send1: 2 22 2 29 2 ?                 #매출문자발송 (평일은 저녁 8시30분, 11시30분)
         sales.sms.send2: 2 22 2 29 2 ?                 #매출문자발송 (주말(토/일)은 오전 10시, 오후 2시, 6시, 저녁 10시)
         sales.upload: 2 22 2 29 2 ?                    #매출반영
+        customer.create: 2 22 2 29 2 ?                 #회원통계
+        customer.order.create: 2 22 2 29 2 ?           #회원주문통계
 
     #모니터링
     monitoring:

+ 3 - 1
src/main/resources/config/application-style.yml

@@ -145,12 +145,14 @@ cron:
         aflink.inflow.create: 0 16 * * * *             #유입통계 (1시간 1회)
         aflink.inflow.yesterday.create: 2 22 2 29 2 ?  #어제일자유입통계
         order.daily.create: 0 20 1 * * *               #주문일자별통계
-        order.datetime.create: 0 10 * * * ?            #주문시간대별통계 (매시간)
+        order.datetime.create: 0 10 * * * *            #주문시간대별통계 (매시간)
         pay.create: 0 25 0 * * *                       #결제수단통계
         pay.sub.create: 0 55 0 * * *                   #부결제수단통계
         sales.sms.send1: 0 30 20,23 * * MON-FRI        #매출문자발송 (평일은 저녁 8시30분, 11시30분)
         sales.sms.send2: 0 0 10,14,18,22 * * SAT,SUN   #매출문자발송 (주말(토/일)은 오전 10시, 오후 2시, 6시, 저녁 10시)
         sales.upload: 0 0 6 * * *                      #매출반영 (매일 아침 6시)
+        customer.create: 0 0 3 * * *                   #회원통계
+        customer.order.create: 0 30 3 * * *            #회원주문통계
 
     #모니터링
     monitoring: