ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024-01-18
    스파르타/TIL(Today I Learned) 2024. 1. 18. 22:38
    더보기

    SQL 코드카타

     

    1193. Monthly Transactions I(SQL) (그룹으로 삼는 컬럼에 null값, Group과 join관련, 복잡 꼭 다시 복습, 시행착오 굉장히 많았음, 그룹으로 하는 것 중에 null도 있어 max와 sum고려(여기선 max로해야만 유효))

    https://leetcode.com/problems/monthly-transactions-i/description/

    년도월별, 나라별 transaction수와 양, 승인된 transaction수와 양을 구하는 문제이다

    1차 시도

    WITH approved AS(
        SELECT t_s.id ,
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_S.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country , 
            count(t.id) trans_count,
            a.approved_count,
            sum(t.amount) trans_total_amount,
            a.approved_total_amount
    FROM Transactions t
    LEFT JOIN approved a ON t.id = a.id
    GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    

    처음에 긴가민가하다가 inner join해서 실패 left로 고치고나서는 아래같이 approved없는 경우에 실패

    #test case2
    | id  | country | state    | amount | trans_date |
    | --- | ------- | -------- | ------ | ---------- |
    | 121 | US      | declined | 1000   | 2018-12-18 |
    | 122 | US      | declined | 2000   | 2018-12-19 |
    | 123 | US      | declined | 2000   | 2019-01-01 |
    | 124 | DE      | declined | 2000   | 2019-01-07 |
    

     

    2차시도

    case로 null인 경우 0으로 수정(declined되서 제외된 경우에 대해서 처리)

    WITH approved AS(
        SELECT t_s.id ,
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_S.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country , 
            count(t.id) trans_count,
            CASE WHEN a.approved_count IS NULL THEN 0
            ELSE a.approved_count END approved_count,
            sum(t.amount) trans_total_amount,
            CASE WHEN a.approved_total_amount IS NULL THEN 0
            ELSE a.approved_total_amount END approved_total_amount
    FROM Transactions t
    LEFT JOIN approved a ON t.id = a.id
    GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    

     매우 긴 tc3(너무 길어서 블로그에는 생략해 두도록하겠음)

    WITH approved AS(
        SELECT t_s.id ,
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_S.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT *
    FROM approved a
    WHERE a.country = 'LL'
    
    #다르게 나온 부분 LL의 19-07꺼 승인 수랑 총합 다르게 나왔어서 그부분만 봤는데 
    #여기선 똑바로됨
    | id  | month   | country | approved_count | approved_total_amount |
    | --- | ------- | ------- | -------------- | --------------------- |
    | 83  | 2019-02 | LL      | 1              | 789                   |
    | 112 | 2019-07 | LL      | 2              | 3825                  |
    | 174 | 2019-05 | LL      | 1              | 3094                  |
    

    join의 on 조건을 그룹을 월별과 나라로 했으니 그걸로 붙인다는 방식 하나
    아니면 id로 연결 한 뒤에 각 id별로 세었을 때 max를 이용해서 null과 아닌 값이 있다면 아닌값이 리턴되도록(사실 이런 듯하긴한데 살짝 긴가민가함)

    WITH approved AS(
        SELECT t_s.id ,
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_S.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country , 
            sum(a.approved_count) , #max로 해도 19-07의 LL은 값 동일
            max(a.approved_total_amount) 
    FROM Transactions t
    LEFT JOIN approved a ON t.id = a.id
    GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    

    max나 sum으로 해주지 않았을 경우 null로 나옴(approved아니라서 그렇게 나오는 부분이 있는 듯한데 그런데 이미 그룹해줬으니 된거 아닌가 싶기도 한데.. 흠 헷깔리는듯하다)

     

    3차 시도

    이 경우에 대해서 max나 sum으로 처리해도 되지만 그것보다는 join하는 공통 컬럼의 기준을 다르게 해주는 것이 훨씬 안전해보이고 좋아보였기에 DATE_FORMAT(t.trans_date,'%Y-%m') = a.month AND t.country = a.country 로 바꿔주었다

    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_S.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country , 
            count(t.id) trans_count,
            CASE WHEN a.approved_count IS NULL THEN 0
            ELSE a.approved_count END approved_count,
            sum(t.amount) trans_total_amount,
            CASE WHEN a.approved_total_amount IS NULL THEN 0
            ELSE a.approved_total_amount END approved_total_amount
    FROM Transactions t
    LEFT JOIN approved a 
        ON DATE_FORMAT(t.trans_date,'%Y-%m') = a.month
        AND t.country = a.country
    GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    
    #test case4
    | id  | country | state    | amount | trans_date |
    | --- | ------- | -------- | ------ | ---------- |
    | 121 | US      | approved | 1000   | 2018-12-18 |
    | 122 | US      | declined | 2000   | 2018-12-19 |
    | 123 | US      | approved | 2000   | 2019-01-01 |
    | 124 | null    | approved | 2000   | 2019-01-07 |
    
    #out
    | month   | country | trans_count | approved_count | trans_total_amount | approved_total_amount |
    | ------- | ------- | ----------- | -------------- | ------------------ | --------------------- |
    | 2018-12 | US      | 2           | 1              | 3000               | 1000                  |
    | 2019-01 | US      | 1           | 1              | 2000               | 2000                  |
    | 2019-01 | null    | 1           | 0              | 2000               | 0                     |
    
    #expected
    | month   | country | trans_count | approved_count | trans_total_amount | approved_total_amount |
    | ------- | ------- | ----------- | -------------- | ------------------ | --------------------- |
    | 2018-12 | US      | 2           | 1              | 3000               | 1000                  |
    | 2019-01 | US      | 1           | 1              | 2000               | 2000                  |
    | 2019-01 | null    | 1           | 1              | 2000               | 2000                  |
    

     나라이름이 null인 case가 나왔다(여기서 통과하지 못했다..ㅠ) 나라이름이 null인 case가 나왔다(여기서 통과하지 못했다..ㅠ) 나라이름이 null이면 어케 하는거지 조금 고민이 됬었다

    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_S.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT *
    FROM approved a
    
    #out
    | month   | country | approved_count | approved_total_amount |
    | ------- | ------- | -------------- | --------------------- |
    | 2018-12 | US      | 1              | 1000                  |
    | 2019-01 | US      | 1              | 2000                  |
    | 2019-01 | null    | 1              | 2000                  |
    

    이러면 approved테이블은 문제 없이 되는 것을 확인했다

    원래 시도한 쿼리에서 case의 then을 -1로 바꿔주니 -1로 나온 것으로 보아 예상되로 거기부분에서 0으로 처리 되었는 것 같다 그럼 join과정에서 null로 간 것인데 왜 그런지 예상이 가지 않아서 조인한뒤 approved관련 열들을 확인해보았다

    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_S.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country ,
            a.approved_count,
            a.approved_total_amount
    FROM Transactions t
    LEFT JOIN approved a 
        ON DATE_FORMAT(t.trans_date,'%Y-%m') = a.month
        AND t.country = a.country
    GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    
    #out
    | month   | country | approved_count | approved_total_amount |
    | ------- | ------- | -------------- | --------------------- |
    | 2018-12 | US      | 1              | 1000                  |
    | 2019-01 | US      | 1              | 2000                  |
    | 2019-01 | null    | null           | null                  |
    

    역시 예상대로 null로 들어가있다 흠 조건중 하나에 null이 있어서 그런 것인가?

    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_S.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT *
    FROM approved a
    WHERE a.month = '2019-01' AND a.country = null
    
    #out
    | month | country | approved_count | approved_total_amount |
    | ----- | ------- | -------------- | --------------------- |
    
    #a.country is null로 조건을 바꾸면
    #out
    | month   | country | approved_count | approved_total_amount |
    | ------- | ------- | -------------- | --------------------- |
    | 2019-01 | null    | 1              | 2000                  |
    

    예상 대로 아무값도 걸리지 않았다.. is null로 하면 나오긴한다… 찝찝하긴한데 이러면 or로 country가 null인 경우도 조인해줘야할지도 모른다고 생각하였다

    그래서 추가해주었다

    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_S.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country , 
            count(t.id) trans_count,
            CASE WHEN a.approved_count IS NULL THEN 0
            ELSE a.approved_count END approved_count,
            sum(t.amount) trans_total_amount,
            CASE WHEN a.approved_total_amount IS NULL THEN 0
            ELSE a.approved_total_amount END approved_total_amount
    FROM Transactions t
    LEFT JOIN approved a 
        ON DATE_FORMAT(t.trans_date,'%Y-%m') = a.month
        AND (t.country = a.country OR a.country IS NULL)
    GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    
    #out
    | month   | country | trans_count | approved_count | trans_total_amount | approved_total_amount |
    | ------- | ------- | ----------- | -------------- | ------------------ | --------------------- |
    | 2018-12 | US      | 2           | 1              | 3000               | 1000                  |
    | 2019-01 | US      | 2           | 1              | 4000               | 2000                  |
    | 2019-01 | null    | 1           | 1              | 2000               | 2000                  |
    
    #expected
    | month   | country | trans_count | approved_count | trans_total_amount | approved_total_amount |
    | ------- | ------- | ----------- | -------------- | ------------------ | --------------------- |
    | 2018-12 | US      | 2           | 1              | 3000               | 1000                  |
    | 2019-01 | US      | 1           | 1              | 2000               | 2000                  |
    | 2019-01 | null    | 1           | 1              | 2000               | 2000                  |
    

    아니여서 제외 된부분도 들어간 느낌이 들었다

    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_S.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country ,
            a.approved_count,
            a.approved_total_amount
    FROM Transactions t
    LEFT JOIN approved a 
        ON DATE_FORMAT(t.trans_date,'%Y-%m') = a.month
        AND (t.country = a.country OR a.country IS NULL)
    GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    
    #out
    | month   | country | approved_count | approved_total_amount |
    | ------- | ------- | -------------- | --------------------- |
    | 2018-12 | US      | 1              | 1000                  |
    | 2019-01 | US      | 1              | 2000                  |
    | 2019-01 | null    | 1              | 2000                  |
    

    이건 제대로 왔는데 왜 계산할 때 trans부분을… 아 이부분을 체크하는게 아니라 전체 갯수부분이 문제가 되는 것이니

    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_s.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country , 
            count(t.id) trans_count,
            sum(t.amount) trans_total_amount
    FROM Transactions t
    LEFT JOIN approved a 
        ON DATE_FORMAT(t.trans_date,'%Y-%m') = a.month
        AND (t.country = a.country OR a.country IS NULL)
    GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    
    #out
    | month   | country | trans_count | trans_total_amount |
    | ------- | ------- | ----------- | ------------------ |
    | 2018-12 | US      | 2           | 3000               |
    | 2019-01 | US      | 2           | 4000               |
    | 2019-01 | null    | 1           | 2000               |
    
    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_s.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country , 
            t.id,
            t.amount
    FROM Transactions t
    LEFT JOIN approved a 
        ON DATE_FORMAT(t.trans_date,'%Y-%m') = a.month
        AND (t.country = a.country OR a.country IS NULL)
    #GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    
    #out
    | month   | country | id  | amount |
    | ------- | ------- | --- | ------ |
    | 2018-12 | US      | 121 | 1000   |
    | 2018-12 | US      | 122 | 2000   |
    | 2019-01 | US      | 123 | 2000   |
    | 2019-01 | US      | 123 | 2000   |
    | 2019-01 | null    | 124 | 2000   |
    

    예상대로 한번더 가져오는 듯한데 이유는 모르겠어서

    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.country , 
            count(t_s.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT *
    FROM Transactions t
    LEFT JOIN approved a 
        ON DATE_FORMAT(t.trans_date,'%Y-%m') = a.month
        AND (t.country = a.country OR a.country IS NULL)
    #GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    
    #out
    | id  | country | state    | amount | trans_date | month   | country | approved_count | approved_total_amount |
    | --- | ------- | -------- | ------ | ---------- | ------- | ------- | -------------- | --------------------- |
    | 121 | US      | approved | 1000   | 2018-12-18 | 2018-12 | US      | 1              | 1000                  |
    | 122 | US      | declined | 2000   | 2018-12-19 | 2018-12 | US      | 1              | 1000                  |
    | 123 | US      | approved | 2000   | 2019-01-01 | 2019-01 | null    | 1              | 2000                  |
    | 123 | US      | approved | 2000   | 2019-01-01 | 2019-01 | US      | 1              | 2000                  |
    | 124 | null    | approved | 2000   | 2019-01-07 | 2019-01 | null    | 1              | 2000                  |
    

    느낌이 id까지 같이 묶던지, 그냥 아예 날짜로 해야 할 듯하다 →id는 생각해보니 approved에서 group해준 것 때문에 똑바로 구별 안될듯함

     

    4차 시도

    그래서 그냥 아예 날짜로 기준을 고쳐주었다

    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.trans_date,
            t_s.country , 
            count(t_s.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country , 
            count(t.id) trans_count,
            CASE WHEN a.approved_count IS NULL THEN 0
            ELSE a.approved_count END approved_count,
            sum(t.amount) trans_total_amount,
            CASE WHEN a.approved_total_amount IS NULL THEN 0
            ELSE a.approved_total_amount END approved_total_amount
    FROM Transactions t
    LEFT JOIN approved a 
        ON t.trans_date = a.trans_date
        AND (t.country = a.country OR a.country IS NULL)
    GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    
    #month가 아닌 그냥 trans_date로 해줬더니 4번은 통과하였지만 다시 3번이 불통하였다
    #걸린 부분은 이전과 동일하게 LL부분이 안되었다
    
    #tc3에 대하여 간략히 확인할 부분만 보기 위해서 다음과 같이 바꿔주었다
    | id  | country | state    | amount | trans_date |
    | --- | ------- | -------- | ------ | ---------- |
    | 1   | MR      | approved | 253    | 2019-05-24 |
    | 2   | LL      | declined | 307    | 2019-07-07 |
    | 3   | LL      | declined | 3605   | 2019-02-05 |
    | 4   | LL      | approved | 789    | 2019-02-23 |
    | 5   | LL      | approved | 523    | 2019-07-23 |
    | 6   | LL      | approved | 3094   | 2019-05-22 |
    | 7   | LL      | approved | 3302   | 2019-07-11 |
    | 8   | LL      | declined | 4055   | 2019-01-06 |
    | 9   | LL      | declined | 1210   | 2019-09-01 |
    
    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.trans_date,
            t_s.country , 
            count(t_s.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country , 
            t.id,
            a.approved_count,
            t.amount,
            a.approved_total_amount
    FROM Transactions t
    LEFT JOIN approved a 
        ON t.trans_date = a.trans_date
        AND (t.country = a.country OR a.country IS NULL)
    #GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    
    #out
    | month   | country | id | approved_count | amount | approved_total_amount |
    | ------- | ------- | -- | -------------- | ------ | --------------------- |
    | 2019-05 | MR      | 1  | 1              | 253    | 253                   |
    | 2019-07 | LL      | 2  | null           | 307    | null                  |
    | 2019-02 | LL      | 3  | null           | 3605   | null                  |
    | 2019-02 | LL      | 4  | 1              | 789    | 789                   |
    | 2019-07 | LL      | 5  | 2              | 523    | 3825                  |
    | 2019-05 | LL      | 6  | 1              | 3094   | 3094                  |
    | 2019-07 | LL      | 7  | null           | 3302   | null                  |
    | 2019-01 | LL      | 8  | null           | 4055   | null                  |
    | 2019-09 | LL      | 9  | null           | 1210   | null                  |
    

     그래서 저번에 했던 것이 떠올라 case의 판단 부분을 단순 컬럼이 아닌 sum이나 max같은 집계함수를 사용해준 값으로 해주면 되겠다 생각되어 해주었으나 출력되는 값은 그대로 뒀더니 null로 나오는 경우가 생겼고, 그래서 출력 값도 sum이나 max로 해주면 될 듯 하였다

     

    최종적으로

    WITH approved AS(
        SELECT 
            DATE_FORMAT(t_s.trans_date,'%Y-%m') month,
            t_s.trans_date,
            t_s.country , 
            count(t_s.id) approved_count,
            sum(t_s.amount) approved_total_amount
        FROM Transactions t_s
        WHERE t_s.state='approved'
        GROUP BY DATE_FORMAT(t_s.trans_date,'%Y-%m'),t_s.country
    )
    SELECT DATE_FORMAT(t.trans_date,'%Y-%m') month,
            t.country , 
            count(t.id) trans_count,
            CASE WHEN MAX(a.approved_count) IS NULL THEN 0
            ELSE MAX(a.approved_count) END approved_count,
            sum(t.amount) trans_total_amount,
            CASE WHEN MAX(a.approved_total_amount) IS NULL THEN 0
            ELSE MAX(a.approved_total_amount) END approved_total_amount
    FROM Transactions t
    LEFT JOIN approved a 
        ON t.trans_date = a.trans_date
        AND (t.country = a.country OR a.country IS NULL)
    GROUP BY DATE_FORMAT(t.trans_date,'%Y-%m'),t.country
    

     이렇게 제출하니 통과되었으며, 계속 헷깔리는 SUM으로 했을 경우를 테스트 한 경우를 추가로 적을 것이다(SUM은 특정 경우 안되는 경우가 발생하였다)

    갯수 부분에서는 상관이 없으나 null값이 declined된 행들로 인해서 생기는데 그룹 지었을 때 제일 첫 행이 그부분이라 그부분에 걸려서 null값으로 판정되지 않기 위해 max또는 sum을 사용해주면 될듯하다 그런데 여전히 엄청 길던 tc3의 경우는 실패했는데 출력으로 보이는 부분상으로는 어디 부분 잘못됬는지도 안 표시되서 제출해서 확인해봐야할 듯하다?? SUM으로 했을 때는 실패했는데 MAX로 하니 성공되었음…? 체크용 위해서 sum으로 제출해서 확인해보겠음→일단 MAX는 제출성공

    출력 결과들이 매우 길어서 직접 tc를 추가해서 테스트 할때는 확인을 할 수 없었고, 째든 비교사이트 통해 확인 한 결과(여기서 우연히 코드 서로 같은 것 같은데 다른부분 뭐있지 찾던 과정에서 찾은 것인데 매우 유용할듯하다 두 개의 글을 비교해서 서로 다른 부분을 확인해주는 사이트이다 https://wepplication.github.io/tools/compareDoc/ )

    째든 많은 부분 중 유일하게 통과 못한 부분이

    | 2019-06 | ZB      | 2           | 21              | 3398               | 2321160                  |(취소선이 내 출력)

    이였고 

    #주어진 테이블에서 ZB관련 데이터
    | id  | country | state    | amount | trans_date |
    | --- | ------- | -------- | ------ | ---------- |
    | 126 | ZB      | declined | 2238   | 2019-06-13 |
    | 156 | ZB      | approved | 1882   | 2019-03-25 |
    | 473 | ZB      | approved | 1160   | 2019-06-13 |
    

     를 통해서 확인해볼 수 있을 듯했다

    그리고 이를 통해 내린 결론은 다른 값이 존재할 수도 있으니 MAX로 하는게 나은 것 같다고 생각하였다 (sum하면 걍 세어서 더해버릴 수도 있으니)

     

    그리고 추가 여담으로 확실히 runtime은 같은 쿼리 돌려도 그때 그때 조금 씩 달라지는 듯하다, 아까는 1080ms이였는데 지금음 852ms이다.

    쿼리에 대해서 간단히 설명해보면 우선 Transactions테이블을 활용하여 t_s.state='approved'라는 조건을 만족하는 데이터만을 가져와서 년월과 나라로 그룹을 지어 년월로 묶은 월, 나중에 join할 때 공통컬럼으로 쓸 tras_date, 나라, 승인한 id갯수, 승인한 총 양이 출력되는 테이블을 approved로 선언하고

    그뒤 다시 Transactions테이블과 left join하여 공통 기준을 trans_date와 country로 하는데 country부분은 같거나 approved의 country가 null값일 경우(해당 케이스가 존재하여 포함시켜주기 위해서 추가되었음)로 해주어 년월과 나라로 그룹을 지은 다음, 년월, 나라, 총 id갯수, a.approved_count의 최댓값이(null과 일반 값이 있으면 일반 값이 더 크다고 판별 됨)이 null이면 0으로 아니면 a.approved_count의 최댓값으로 출력해주고 총량에 대해서도 동일하게 해주었다

    오늘은 프로젝트 발표일이라 오전중에는 계속 조금이라도 더 보완할려고 이것저것 코드 수정하고 하다보니 시간이 다 갔고, 점심이후 오후는 발표, 끝나고는 관련 회고 및 노가리 뒷풀이를 하다보니 시간이 생각보다 많이 지나있어서 코드카타를 SQL 한문제만 겨우 풀었다(사실 시간상으로는 조금 더 풀만했는데 이 한문제에서 매우 많은 시간을 소모하였다.. 꽤 복잡하다고 느껴지는 문제라고 생각한다.) 그리고 그외 프로젝트하면서 작성했던 쿼리나 파이썬 코드에 대해선 블로그에 작성할까도 생각했으나, 쿼리는 유용하다 싶은 방식 한두개정도만 고려해보고 있고, 파이썬은 깔끔하게 정리된 느낌은 아니고, 팀원분들께는 따로 노션을 통해 공유해드렸어가지고, 만약 프로젝트 관련 내용을 정리해서 적게 된다면 그 때 같이 적을 듯하다. 일주일간의 프로젝트가 드디어 끝났는데 시원섭섭 느낌도 있고, 피곤한 것도 이제 몰려오는 듯하고 내일 국가취업지원관련하여 상담을 하러 오전에 다녀와야해서 오늘은 이정도로 짧게 정리하고 내일이나 주말중에 TIL과 WIL을 통해 정리를 할까싶다.

    '스파르타 > TIL(Today I Learned)' 카테고리의 다른 글

    2024-01-20~2024-01-21  (1) 2024.01.22
    2024-01-19  (0) 2024.01.19
    2024-01-17  (0) 2024.01.18
    2024-01-16  (0) 2024.01.16
    2024-01-15  (1) 2024.01.15
Designed by Tistory.