SQL ๋ฌธ์ œ ํ•ด๊ฒฐ - ๋™์ผ ํ–‰์— ๊ฐ’ ํ•ฉ์น˜๊ธฐ

2022. 2. 17. 23:47ใ†๊ฐœ๋… ์ •๋ฆฌ ์ž‘์—…์‹ค/Data Base

728x90
๋ฐ˜์‘ํ˜•

๐Ÿš€ Code Content

 

     ๐Ÿ”ฝ  Service.java

@Slf4j
@Service("junyharangSaleDailyStatisticService")
public class JunyHarangSaleDailyStatisticService implements LogicRepository {

    @Autowired
    JdbcQueryFactory query;

    @Autowired
    JunyHarangoctDao junyharangoctdao;

    @Override
    public List<Map<String, Object>> list(QueryContext context) {
        Map<String,Object> data = context.getData();
        if (data == null) {
            throw new ApiException("500", "data is null");
        }

        int page = JsonUtils.getIntValue(data, "page");
        int size = JsonUtils.getIntValue(data, "pageSize");

        String period_fromto = JsonUtils.getStringValue(data, "period_fromto");
        String channel_matching = JsonUtils.getStringValue(data, "channel_matching");

        String from ="";
        String to ="";
        String sql = "";
        int term = period_fromto.length();

        if(term == 21){

            if (!StringUtils.isEmpty(period_fromto)) {
                String[] tmp = period_fromto.split("~");
                from = tmp[0].replace("-","");
                to = tmp[1].replace("-","");
            }

            sql =   " SELECT a.* from( " +
                    " select to_char(to_date(a.sales_date, 'yyyyMMdd'), 'yyyy-MM-dd') period, " +
                    " a.sales_amt sales, " +
                    " a.pg_commission_amt pg_fee, " +
                    " a.company_settlement_amt store_settlement_amt, " +
                    " a.self_pay_coupun coupon, " +
                    " a.point , " +
                    " a.self_goods_deli_amt delivery_fee, " +
                    " a.tot_settlement_amt final_settlement_amt " +
                    " from tbl_stat_sales_cnt a " +
                    " WHERE 1=1 " +
                    " AND a.sales_date >= "+ from +" " +
                    " AND a.sales_date <= "+ to +" " ;
                    if (!("".equals(channel_matching) || channel_matching.isEmpty())) {
                        sql += " AND a.ord_channel IN( "+ channel_matching +" ) ";
                    }
            sql +=  " UNION ALL " +
                    " select 'ํ•ฉ๊ณ„' period, " +
                    " nvl(sum(a.sales_amt),0) sales, " +
                    " nvl(sum(a.pg_commission_amt),0) pg_fee, " +
                    " nvl(sum(a.company_settlement_amt),0) store_settlement_amt, " +
                    " nvl(sum(a.self_pay_coupun),0) coupon, " +
                    " nvl(sum(a.point),0) point, " +
                    " nvl(sum(a.self_goods_deli_amt),0) delivery_fee, " +
                    " nvl(sum(a.tot_settlement_amt),0) final_settlement_amt " +
                    " from tbl_stat_sales_cnt a " +
                    " WHERE 1=1 " +
                    " AND a.sales_date >= "+ from +" " +
                    " AND a.sales_date <= "+ to +" " ;
                    if (!("".equals(channel_matching) || channel_matching.isEmpty())) {
                        sql += " AND a.ord_channel IN( "+ channel_matching +" ) ";
                    }
            sql +=  " )a " +
                    " ORDER BY (CASE WHEN a.period = 'ํ•ฉ๊ณ„' THEN 2 ELSE 1 END), a.period DESC ";
        }else {

                if (!StringUtils.isEmpty(period_fromto)) {
                    String[] tmp = period_fromto.split("~");
                    from = tmp[0].replace("-","");
                    to = tmp[1].replace("-","");
                }

            sql =   " SELECT a.* from( " +
                    " select to_char(to_date(a.sales_date, 'yyyyMMdd'), 'yyyy-MM') period, " +
                    " a.sales_amt sales, " +
                    " a.pg_commission_amt pg_fee, " +
                    " a.company_settlement_amt store_settlement_amt, " +
                    " a.self_pay_coupun coupon, " +
                    " a.point, " +
                    " a.self_goods_deli_amt delivery_fee, " +
                    " a.tot_settlement_amt final_settlement_amt " +
                    " from tbl_stat_sales_cnt a " +
                    " WHERE 1=1 " +
                    " AND SUBSTR(a.sales_date,-8,6) >= "+ from +" " +
                    " AND SUBSTR(a.sales_date,-8,6) <= "+ to +" " ;
                    if (!("".equals(channel_matching) || channel_matching.isEmpty())) {
                        sql += " AND a.ord_channel IN( "+ channel_matching +" ) ";
                    }
            sql +=  " UNION ALL " +
                    " select 'ํ•ฉ๊ณ„' period, " +
                    " nvl(sum(a.sales_amt),0) sales, " +
                    " nvl(sum(a.pg_commission_amt),0) pg_fee, " +
                    " nvl(sum(a.company_settlement_amt),0) store_settlement_amt, " +
                    " nvl(sum(a.self_pay_coupun),0) coupon, " +
                    " nvl(sum(a.point),0) point, " +
                    " nvl(sum(a.self_goods_deli_amt),0) delivery_fee, " +
                    " nvl(sum(a.tot_settlement_amt),0) final_settlement_amt " +
                    " from tbl_stat_sales_cnt a " +
                    " WHERE 1=1 " +
                    " AND SUBSTR(a.sales_date,-8,6) >= "+ from +" " +
                    " AND SUBSTR(a.sales_date,-8,6) <= "+ to +" " ;
                    if (!("".equals(channel_matching) || channel_matching.isEmpty())) {
                        sql += " AND a.ord_channel IN( "+ channel_matching +" ) ";
                    }
            sql +=  " )a " +
                    " ORDER BY (CASE WHEN a.period = 'ํ•ฉ๊ณ„' THEN 2 ELSE 1 END), a.period DESC ";
        }

        log.info("sql - " + sql);
        List<Map<String, Object>> list = (List<Map<String, Object>>)query.list(sql, page, size, "zinSaleDailyStatistic").get("items");
        return list;
    }

    @Override
    public Map<String, Object> read(String id) {
        return null;
    }

    @Override
    public int create(Node node) {
        return 0;
    }

    @Override
    public int update(Node node) {
        return 0;
    }

    @Override
    public int delete(String id) {
        return 0;
    }

    private void replaceFilterList(Map<String,Object> params, String filterKey, String listKey) {
        List<String> filter = JsonUtils.getStringList(params, filterKey);
        params.put(listKey, filter);
    }
}

 

     ๐Ÿ”ฝ  SQL๋ฌธ

SELECT * FROM ( 
SELECT ROWNUM AS RNUM, PL.* 
FROM ( 
SELECT * 
FROM (  
SELECT a.* 
from(  
select to_char(to_date(a.sales_date, 'yyyyMMdd'), 'yyyy-MM') period,  a.sales_amt sales,  a.pg_commission_amt pg_fee,  a.company_settlement_amt store_settlement_amt,  a.self_pay_coupun coupon,  a.point,  a.self_goods_deli_amt delivery_fee,  a.tot_settlement_amt final_settlement_amt  
from tbl_stat_sales_cnt a  
WHERE 1=1  
AND SUBSTR(a.sales_date,-8,6) >= 202108  
AND SUBSTR(a.sales_date,-8,6) <= 202202  
UNION ALL  
select 'ํ•ฉ๊ณ„' period,  nvl(sum(a.sales_amt),0) sales,  nvl(sum(a.pg_commission_amt),0) pg_fee,  nvl(sum(a.company_settlement_amt),0) store_settlement_amt,  nvl(sum(a.self_pay_coupun),0) coupon,  nvl(sum(a.point),0) point,  nvl(sum(a.self_goods_deli_amt),0) delivery_fee,  nvl(sum(a.tot_settlement_amt),0) final_settlement_amt  
from tbl_stat_sales_cnt a  
WHERE 1=1  
AND SUBSTR(a.sales_date,-8,6) >= 202108  AND SUBSTR(a.sales_date,-8,6) <= 202202  )a  
ORDER BY (CASE WHEN a.period = 'ํ•ฉ๊ณ„' THEN 2 ELSE 1 END), a.period DESC  ) 
WHERE ROWNUM <= 10 ) PL ) 
WHERE RNUM > 0;

 

 

โš ๏ธ ๋ฌธ์ œ ๋ฐœ์ƒ!

 

์œ„์˜ ๊ฒฐ๊ณผ์™€ ๊ฐ™์ด PERIOD์— 2022-02 ์ปฌ๋Ÿผ ๋‘ ๊ฐœ๊ฐ€ ํ•ฉ์ณ์ ธ์„œ ํ•˜๋‚˜๋กœ ๋‚˜์™€์•ผ ํ•˜๋Š”๋ฐ, ๋‘ ๊ฐœ๋กœ ์ชผ๊ฐœ์ ธ์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด์—์š”.

 

 

๐Ÿป ๋ฌธ์ œ ํ•ด๊ฒฐ!

 

SELECT *
FROM (
select to_char(to_date(sales_date, 'yyyyMMdd'), 'yyyy-MM') period, sum(sales_amt) AS sales, sum(pg_commission_amt) AS pg_fee, sum(company_settlement_amt) AS store_settlement_amt, sum(self_pay_coupun) AS coupon, sum(point) AS point, sum(self_goods_deli_amt) AS delivery_fee, sum(tot_settlement_amt) AS final_settlement_amt
from tbl_stat_sales_cnt a  
WHERE 1=1
AND SUBSTR(a.sales_date,-8,6) >= 202108  
AND SUBSTR(a.sales_date,-8,6) <= 202202
GROUP BY to_char(to_date(a.sales_date, 'yyyyMMdd'), 'yyyy-MM')
);

 

๋จผ์ € ์„œ๋ธŒ ์ฟผ๋ฆฌ์ ˆ์— ๋‚ ์งœ๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์ปฌ๋Ÿผ๋“ค์— ํ•ฉ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๊ฒƒ์ด๊ณ , ๊ทธ๊ฒƒ์„ ๋ฌถ์–ด sales_date ์ปฌ๋Ÿผ ๊ธฐ์ค€์œผ๋กœ ๋ฌถ์–ด์ฃผ๋ฉด ์ƒ๊ฐํ•œ ๊ฒƒ์ด์—์š”. ๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์ด Query ๋ฌธ์„ ์ž‘์„ฑํ•˜๊ณ , DBeaver๋ฅผ ํ†ตํ•ด Testํ•œ ๊ฒฐ๊ณผ ์›ํ•˜๋Š” ๊ฐ’์ด ๋‚˜์˜จ ๊ฒƒ์ด์—์š”.

 

 

SELECT * FROM ( 
SELECT ROWNUM AS RNUM, PL.* 
FROM ( 
SELECT * 
FROM (  
SELECT a.* 
from(
select to_char(to_date(sales_date, 'yyyyMMdd'), 'yyyy-MM') period, sum(sales_amt) AS sales, sum(pg_commission_amt) AS pg_fee, sum(company_settlement_amt) AS store_settlement_amt, sum(self_pay_coupun) AS coupon, sum(point) AS point, sum(self_goods_deli_amt) AS delivery_fee, sum(tot_settlement_amt) AS final_settlement_amt
from tbl_stat_sales_cnt a  
WHERE 1=1
AND SUBSTR(a.sales_date,-8,6) >= 202108  
AND SUBSTR(a.sales_date,-8,6) <= 202202
GROUP BY to_char(to_date(a.sales_date, 'yyyyMMdd'), 'yyyy-MM')
UNION ALL
select 'ํ•ฉ๊ณ„' period,  nvl(sum(a.sales_amt),0) sales,  nvl(sum(a.pg_commission_amt),0) pg_fee,  nvl(sum(a.company_settlement_amt),0) store_settlement_amt,  nvl(sum(a.self_pay_coupun),0) coupon,  nvl(sum(a.point),0) point,  nvl(sum(a.self_goods_deli_amt),0) delivery_fee,  nvl(sum(a.tot_settlement_amt),0) final_settlement_amt  
from tbl_stat_sales_cnt a  
WHERE 1=1  
AND SUBSTR(a.sales_date,-8,6) >= 202108  AND SUBSTR(a.sales_date,-8,6) <= 202202  )a  
ORDER BY (CASE WHEN a.period = 'ํ•ฉ๊ณ„' THEN 2 ELSE 1 END), a.period DESC  ) 
WHERE ROWNUM <= 10 ) PL ) 
WHERE RNUM > 0;
๋ฐ˜์‘ํ˜•

๊ธฐ์กด์— ์žˆ์—ˆ๋˜ Query๋ฌธ์— ์ฃผ๋‹ˆํ•˜๋ž‘์ด ์ˆ˜์ •ํ•œ ๋ถ€๋ถ„์„ ์‚ดํฌ์‹œ ์–น์–ด์„œ ๋‹ค์‹œ Test๋ฅผ ํ•ด ๋ณธ ๊ฒƒ์ด์—์š”.

์—ญ์‹œ๋‚˜ ์›ํ•˜๋Š” ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๊ฑธ Service์— ๋“ค์–ด ์žˆ๋Š” Query๋ฌธ์— ๋‹ค์‹œ ์‚ดํฌ์‹œ ์–น์–ด ์ค€ ๊ฒƒ์ด์—์š”.

 

@Slf4j
@Service("junyharangSaleDailyStatisticService")
public class junyharangSaleDailyStatisticService implements LogicRepository {

    @Autowired
    JdbcQueryFactory query;

    @Autowired
    JunyharnagoctDao junyharangoctdao;

    @Override
    public List<Map<String, Object>> list(QueryContext context) {
        Map<String,Object> data = context.getData();
        if (data == null) {
            throw new ApiException("500", "data is null");
        }

        int page = JsonUtils.getIntValue(data, "page");
        int size = JsonUtils.getIntValue(data, "pageSize");

        String period_fromto = JsonUtils.getStringValue(data, "period_fromto");
        String channel_matching = JsonUtils.getStringValue(data, "channel_matching");

        String from ="";
        String to ="";
        String sql = "";
        int term = period_fromto.length();

        if(term == 21){

            if (!StringUtils.isEmpty(period_fromto)) {
                String[] tmp = period_fromto.split("~");
                from = tmp[0].replace("-","");
                to = tmp[1].replace("-","");
            }

            sql =   " SELECT a.* from( " +
                    " select to_char(to_date(a.sales_date, 'yyyyMMdd'), 'yyyy-MM-dd') period, " +
                    " a.sales_amt sales, " +
                    " a.pg_commission_amt pg_fee, " +
                    " a.company_settlement_amt store_settlement_amt, " +
                    " a.self_pay_coupun coupon, " +
                    " a.point , " +
                    " a.self_goods_deli_amt delivery_fee, " +
                    " a.tot_settlement_amt final_settlement_amt " +
                    " from tbl_stat_sales_cnt a " +
                    " WHERE 1=1 " +
                    " AND a.sales_date >= "+ from +" " +
                    " AND a.sales_date <= "+ to +" " ;
                    if (!("".equals(channel_matching) || channel_matching.isEmpty())) {
                        sql += " AND a.ord_channel IN( "+ channel_matching +" ) ";
                    }
            sql +=  " UNION ALL " +
                    " select 'ํ•ฉ๊ณ„' period, " +
                    " nvl(sum(a.sales_amt),0) sales, " +
                    " nvl(sum(a.pg_commission_amt),0) pg_fee, " +
                    " nvl(sum(a.company_settlement_amt),0) store_settlement_amt, " +
                    " nvl(sum(a.self_pay_coupun),0) coupon, " +
                    " nvl(sum(a.point),0) point, " +
                    " nvl(sum(a.self_goods_deli_amt),0) delivery_fee, " +
                    " nvl(sum(a.tot_settlement_amt),0) final_settlement_amt " +
                    " from tbl_stat_sales_cnt a " +
                    " WHERE 1=1 " +
                    " AND a.sales_date >= "+ from +" " +
                    " AND a.sales_date <= "+ to +" " ;
                    if (!("".equals(channel_matching) || channel_matching.isEmpty())) {
                        sql += " AND a.ord_channel IN( "+ channel_matching +" ) ";
                    }
            sql +=  " )a " +
                    " ORDER BY (CASE WHEN a.period = 'ํ•ฉ๊ณ„' THEN 2 ELSE 1 END), a.period DESC ";
        }else {

                if (!StringUtils.isEmpty(period_fromto)) {
                    String[] tmp = period_fromto.split("~");
                    from = tmp[0].replace("-","");
                    to = tmp[1].replace("-","");
                }

            sql =   " SELECT a.* from( " +
                    " select to_char(to_date(a.sales_date, 'yyyyMMdd'), 'yyyy-MM-dd') period, " +
                    " sum(sales_amt) AS sales, " +
                    " sum(pg_commission_amt) AS pg_fee, " +
                    " sum(company_settlement_amt) AS store_settlement_amt, " +
                    " sum(self_pay_coupun) AS coupon, " +
                    " sum(point) AS point , " +
                    " sum(self_goods_deli_amt) AS delivery_fee, " +
                    " sum(tot_settlement_amt) AS final_settlement_amt " +
                    " from tbl_stat_sales_cnt a " +
                    " WHERE 1=1 " +
                    " AND SUBSTR(a.sales_date,-8,6) >= "+ from +" " +
                    " AND SUBSTR(a.sales_date,-8,6) <= "+ to +" " ;
                    if (!("".equals(channel_matching) || channel_matching.isEmpty())) {
                        sql += " AND a.ord_channel IN( "+ channel_matching +" ) ";
                    }
            sql +=  " GROUP BY to_char(to_date(a.sales_date, 'yyyyMMdd'), 'yyyy-MM') " +
  					" UNION ALL " +
                    " select 'ํ•ฉ๊ณ„' period, " +
                    " nvl(sum(a.sales_amt),0) sales, " +
                    " nvl(sum(a.pg_commission_amt),0) pg_fee, " +
                    " nvl(sum(a.company_settlement_amt),0) store_settlement_amt, " +
                    " nvl(sum(a.self_pay_coupun),0) coupon, " +
                    " nvl(sum(a.point),0) point, " +
                    " nvl(sum(a.self_goods_deli_amt),0) delivery_fee, " +
                    " nvl(sum(a.tot_settlement_amt),0) final_settlement_amt " +
                    " from tbl_stat_sales_cnt a " +
                    " WHERE 1=1 " +
                    " AND SUBSTR(a.sales_date,-8,6) >= "+ from +" " +
                    " AND SUBSTR(a.sales_date,-8,6) <= "+ to +" " ;
                    if (!("".equals(channel_matching) || channel_matching.isEmpty())) {
                        sql += " AND a.ord_channel IN( "+ channel_matching +" ) ";
                    }
            sql +=  " )a " +
                    " ORDER BY (CASE WHEN a.period = 'ํ•ฉ๊ณ„' THEN 2 ELSE 1 END), a.period DESC ";
        }

        log.info("sql - " + sql);
        List<Map<String, Object>> list = (List<Map<String, Object>>)query.list(sql, page, size, "zinSaleDailyStatistic").get("items");
        return list;
    }

    @Override
    public Map<String, Object> read(String id) {
        return null;
    }

    @Override
    public int create(Node node) {
        return 0;
    }

    @Override
    public int update(Node node) {
        return 0;
    }

    @Override
    public int delete(String id) {
        return 0;
    }

    private void replaceFilterList(Map<String,Object> params, String filterKey, String listKey) {
        List<String> filter = JsonUtils.getStringList(params, filterKey);
        params.put(listKey, filter);
    }
}

 

 

728x90
๋ฐ˜์‘ํ˜•