MySQL 부분합 관련 문의입니다. 0 4 1,973

by captain [MySQL] Mysql부분합 [2017.05.15 09:19:37]


안녕하세요.

MySQL에서의 부분합 표현관련 문의입니다.

테이블의 데이타는 다음과 같습니다.

url count

/test/a/1/temp.txt 10
/test/a/2/temp.txt 10
/test/a/3/temp.txt 10
/test/b/1/temp.txt 10
/test/b/1/temp.txt 10
/test/b/1/temp.txt 10
/test/b/1/temp.txt 10

 

이를 다음과 같이 보여줘야 합니다. (/ 구분자로 부분합)


result

url count level

/test    70    1
/test/a    30    2
/test/a/1    10    3
/test/a/1/temp.txt    10    4
/test/a/2    10    3
/test/a/2/temp.txt    10    4
/test/a/3    10    3
/test/a/3/temp.txt    10    4
/test/b    40    2
/test/b/1    40    3
/test/b/1/temp.txt    40    4

 

MySQL 쿼리로 가능할까요?

고수님들 도와주세요. ㅠ

by 마농 [2017.05.15 09:55:09]
SELECT url
     , cnt
     , LENGTH(url) - LENGTH(REPLACE(url, '/', '')) lv
  FROM (SELECT url_1, url_2, url_3, url_4
             , COALESCE(url_4, url_3, url_2, url_1) url
             , SUM(cnt) cnt
          FROM (SELECT SUBSTRING_INDEX(url, '/', 2) url_1
                     , SUBSTRING_INDEX(url, '/', 3) url_2
                     , SUBSTRING_INDEX(url, '/', 4) url_3
                     , url url_4
                     , cnt
                  FROM (SELECT '/test/a/1/temp.txt' url, 10 cnt
                        UNION ALL SELECT '/test/a/2/temp.txt', 10
                        UNION ALL SELECT '/test/a/3/temp.txt', 10
                        UNION ALL SELECT '/test/b/1/temp.txt', 10
                        UNION ALL SELECT '/test/b/1/temp.txt', 10
                        UNION ALL SELECT '/test/b/1/temp.txt', 10
                        UNION ALL SELECT '/test/b/1/temp.txt', 10
                        ) t
                ) a
         GROUP BY url_1, url_2, url_3, url_4
          WITH ROLLUP
         HAVING url_1 IS NOT NULL
        ) a
 ORDER BY url
;

 


by captain [2017.05.15 09:56:55]

마농님 답변 감사합니다.

그런데, 혹시 레벨이 가변적인데 (어떤경우는 2가 될수 있고 어떤 경우는 10이 될수도 있습니다.),

혹시 그부분도 가능할까요?

염치없지만 문의드립니다. 죄송합니다.


by 마농 [2017.05.15 10:20:21]
SELECT SUBSTRING_INDEX(url, '/',  lv+1) url
     , SUM(cnt) cnt
     , lv
  FROM (SELECT '/test/a/1/temp.txt' url, 10 cnt
        UNION ALL SELECT '/test/a/2/temp.txt', 10
        UNION ALL SELECT '/test/a/3/temp.txt', 10
        UNION ALL SELECT '/test/b/1/temp.txt', 10
        UNION ALL SELECT '/test/b/1/temp.txt', 10
        UNION ALL SELECT '/test/b/1/temp.txt', 10
        UNION ALL SELECT '/test/b/1/temp.txt', 10
        UNION ALL SELECT '/z1/2/3/4/5/6/7/8/9/10', 10
        ) t
 INNER JOIN
       (SELECT  1 lv
        UNION ALL SELECT  2
        UNION ALL SELECT  3
        UNION ALL SELECT  4
        UNION ALL SELECT  5
        UNION ALL SELECT  6
        UNION ALL SELECT  7
        UNION ALL SELECT  8
        UNION ALL SELECT  9
        UNION ALL SELECT 10
        UNION ALL SELECT 11
        UNION ALL SELECT 12
        UNION ALL SELECT 13
        UNION ALL SELECT 14
        UNION ALL SELECT 15
        ) copy_t
    ON lv <= LENGTH(url) - LENGTH(REPLACE(url, '/', ''))
 GROUP BY SUBSTRING_INDEX(url, '/',  lv+1), lv
 ORDER BY url
;

 


by captain [2017.05.15 13:26:22]

마농님 진심으로 감사드립니다.

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