마지막 질문 입니다..! (SQL 쿼리) 0 8 737

by 와니와플 [2021.02.08 19:25:39]


#메인대시보드 - 추후 합계 값 table 생성하여 속도 올릴 예정
set @SGG = 0; #시군구 미선택시 0 (지도클릭)
set @HD = 0; #행정동 미선택시 0 (지도클릭)
set @M = 0; #전체 선택시 0
현재 시각화 프로젝트를 진행 중에 있습니다.
아래 처럼 작성한 후 더이상은 떠오르지 않는 상황 입니다.. 
더 진보된 방법이 있을까요?

#1 - 1)성별 세대별 소비매출현황 (필터(4) = YEAR, MONTH, SGG, HD)
#5세 단위 → 10세 단위로 수정
SELECT
    N.SEX_CD,
    CASE WHEN N.AGE_CD = 0019 THEN '20대 미만'
         WHEN N.AGE_CD in (2024,2529) THEN '20대'
         WHEN N.AGE_CD in (3034,3539) THEN '30대'
         WHEN N.AGE_CD in (4044,4549) THEN '40대'
         WHEN N.AGE_CD in (5054,5559) THEN '50대'
         WHEN N.AGE_CD in (6064,6569) THEN '60대'
         WHEN N.AGE_CD = 7099 THEN '70대'
    ELSE 'NONE' END,
    SUM(N.AMT_N) AS 2020매출액,
    CONCAT(ROUND(((SUM(N.AMT_N) - SUM(N.AMT_O)) / SUM(N.AMT_O) * 100), 1), '%') AS 매출액증감
FROM
    (
        SELECT
            CASE WHEN @M != 0 AND CONCAT(YEAR(TA_D),MONTH(TA_D)) = '201901' THEN AMT #CONCAT(YEAR,@M)
                 WHEN @M = 0 AND YEAR(TA_D) = '2019' THEN AMT #YEAR
            ELSE 'NONE'
            END AS 'AMT_N',
            CASE WHEN @M != 0 AND CONCAT(YEAR(TA_D),MONTH(TA_D)) = '201801' THEN AMT #CONCAT(YEAR-1,@M)
                 WHEN @M = 0 AND YEAR(TA_D) = '2018' THEN AMT #YEAR-1
            ELSE 'NONE'
            END AS 'AMT_O',
    SEX_CD,
    AGE_CD,
    TA_D
FROM
    GN_SEXAGE
WHERE
	SEX_CD != '법인'
    AND CASE
        WHEN @HD != 0 THEN HD_CD = @HD
        WHEN @SGG != 0 THEN LEFT(HD_CD,5) = @SGG
        ELSE 1
    END)N 
GROUP BY
    N.SEX_CD,
    CASE WHEN N.AGE_CD = 0019 THEN '20대 미만'
         WHEN N.AGE_CD in (2024,2529) THEN '20대'
         WHEN N.AGE_CD in (3034,3539) THEN '30대'
         WHEN N.AGE_CD in (4044,4549) THEN '40대'
         WHEN N.AGE_CD in (5054,5559) THEN '50대'
         WHEN N.AGE_CD in (6064,6569) THEN '60대'
         WHEN N.AGE_CD = 7099 THEN '70대'
    ELSE 'NONE' END;

 

by 마농 [2021.02.09 08:23:03]

각 변수나 컬럼들이 숫자형인가요?
문자형일 듯 한데? 숫자 0 을 주거나, 숫자와 비교하거나 하고 있네요? 왜죠?
각 변수에 들어오는 값의 예시를 들어주세요.
각 컬럼에 들어 있는 값의 예를 들어주세요.
자리수 고정 문자일 듯 한데 아닌가요? 숫자인가요?
HD_CD, @SGG, @HD, @M
실제 변수에 0 이 들어 오나요?
아니면 NULL 인데 0 이라고 생각하시는 건가요?


by 와니와플 [2021.02.09 10:11:11]

null을 0으로 작성 한 부분이 있습니다.

hd_cd, sgg, hd, m 모두 숫자로 들어옵니다. 

전체를 조회하기 위해 설정한 구문이 맞습니다!


by 마농 [2021.02.09 10:18:06]

@m 이 숫자로 들어 온다면? 1, 2, 3 이렇게 들어 온다는 건가요?
그러면 concat(@year, @m) 할 때 이상해 질텐데요?
'01', '02', '03' 처럼 2자리 문자로 들어오는 것 아닌지?
hd_cd 는 총 몇자리 인지? LEFT 로 잘라서 비교하는 이유가 뭔지?
@hd 및 @sgg 는 각 몇자리 인지?


by 와니와플 [2021.02.09 11:23:52]

안그래도 1,2,3으로 들어와서 LEFT로 변환 하였습니다. 
HD_CD는 총 10자리 입니다.

LEFT가 훨씬 유용하네요^^

더불어서, 혹시 ORDER BY DESC말고 제일 숫자 높은 행만 반환하도록 하는 좋은 방법은 없을까요?

조언 감사 드립니다!


by 마농 [2021.02.09 12:35:34]

@M 은 그러면 숫자로 들어온다는 거네요? 1,2, ..., 10, 11, 12
hd_cd 가 10자리라면? @HD 는 몇자리인가요? 5자리? 10자리?
@HD, @SGG 는 몇자리 이며 어떻게 값이 들어오나요? 문자형인지? 숫자형인지?
예시 자료를 들어주시면 좋을 텐데요?
 


by 와니와플 [2021.02.10 10:08:27]

도움 감사 드립니다

SSD(시군구) -> 48125 (창원시 마산합포구) HD(행정동) -> 48125540 (문화동)

이렇게 값이 들어옵니다^^ 현재는 BIGINT MYSQL로 설정 되어 있습니다.


by 마농 [2021.02.15 09:09:08]

다 숫자형이네요?
age_cd 도 숫자형 인가요? 문자형 인가요?
값이 '0019' 로 들어 있나요? 19 로 들어 있나요?


by 마농 [2021.02.15 11:20:16]
SELECT sex_cd
     , age_nm
     , SUM(amt_n) 매출액
     , CONCAT(ROUND(SUM(amt_n) / SUM(amt_o) * 100 - 100, 1), '%') 매출액증감률
  FROM (SELECT sex_cd
             , CASE WHEN age_cd  =  0019        THEN '10대 이하'
                    WHEN age_cd IN (2024, 2529) THEN '20대'
                    WHEN age_cd IN (3034, 3539) THEN '30대'
                    WHEN age_cd IN (4044, 4549) THEN '40대'
                    WHEN age_cd IN (5054, 5559) THEN '50대'
                    WHEN age_cd IN (6064, 6569) THEN '60대'
                    WHEN age_cd  =  7099        THEN '70대 이상'
                END age_nm
             , CASE LEFT(ta_d, 4) WHEN @YEAR   THEN amt END amt_n
             , CASE LEFT(ta_d, 4) WHEN @YEAR-1 THEN amt END amt_o
          FROM gn_sexage
         WHERE sex_cd != '법인'
           AND ta_d >= CONCAT(@YEAR-1, '0101')
           AND ta_d <= CONCAT(@YEAR  , '1231')
           AND ( @M = 0 OR MONTH(ta_d) = @M )
           AND (  (@HD  = 0 AND @SGG  = 0)
               OR (@HD  = 0 AND @SGG != 0 AND hd_cd BETWEEN @SGG * 1000 AND @SGG * 1000 + 999)
               OR (@HD != 0 AND @SGG != 0 AND hd_cd = @HD)
               )
        ) a
 GROUP BY sex_cd, age_nm
;

 

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