mysql 쿼리문 한번만 더 도와주세요..ㅠㅠ 0 4 1,742

by 일우입니담 [SQL Query] MySql [2023.03.21 12:57:03]



어제 구루비에서 많은 도움과 배움을 받았는데, 한번 더 요청 드리겠습니다!
이번건은 과제 테스트이긴 한데, 이 부분이 너무 안풀려서 진행이 안됩니다..ㅠ
스크린샷과 같은 테이블(테이블명은 임의로 A_TABLE 이라 하겠습니다.)이 있을때 다음과 같은 요구사항을 한번의 쿼리로 도출 할 수 있을까요?
집계함수를 써서 어떻게 흉내를 내봤는데, TOP5 메뉴부분에서 너무 헤매고 있습니다..!

by 우리집아찌 [2023.03.21 14:43:46]

원하는 결과를 올려주세요. 내용만으로는 모르겠네요.


by 일우입니담 [2023.03.21 15:08:35]
  BASE_DATE USER_NO TOP1 TOP2 TOP3 TOP4 TOP5 00_06 06_09 09_13 13_16 16_19 19_21 21_24
1 20190301 001 내사용정보 내정보 내카드 세이프박스 이체내역 3 2 5 1 2 4 2
2 20190302 001 모임통장 가이드 내정보 이체내역 내카드 5 0 2 9 8 1 3

이런식으로 기준일자와 USR_NO를 기준으로 정렬된 값을 보고 싶습니다!


by 우리집아찌 [2023.03.21 16:21:12]
-- TOP 1~5 만 구현했어요 OUTER JOIN으로 JOIN 하시면 될겁니다.
-- TOP 이 같다면 ORDER BY 조건을 추가하세요.
-- 손으로 적는거라 오타 있을수 있어요

SELECT  BASE_DATE
              , USR_NO
              , MAX(CASE WHEN RN =1 THEN MENU_NM END ) TOP1
              , MAX(CASE WHEN RN =2 THEN MENU_NM END ) TOP2
              , MAX(CASE WHEN RN =3 THEN MENU_NM END ) TOP3
              , MAX(CASE WHEN RN =4 THEN MENU_NM END ) TOP4
              , MAX(CASE WHEN RN =5 THEN MENU_NM END ) TOP5
  FROM ( SELECT BASE_DATE  
                            , USR_NO
                            , MENU_NM
                            , ROW_NUMBER() OVER(PARTITION BY BASE_DATE , USR_NO ORDER BY MENU_CNT DESC ) RN
                    FROM ( SELECT DISTINCT
                                                TO_DATE(날짜,'YYYYMMDD' ) BASE_DATE
                                              , USER_NO
                                              , MENU_NM
                                              , COUNT(*) OVER(PARTITION BY TO_CHAR(날짜,'YYYYMMDD')) MENU_CNT
                                       FROM A_TABLE
                               )
               )
GROUP BY BASE_DATE , USR_NO
   

 


by 마농 [2023.03.22 15:53:30]
SELECT ymd
     , usr_no
     , MIN(CASE rn WHEN 1 THEN menu_nm END) top1
     , MIN(CASE rn WHEN 2 THEN menu_nm END) top2
     , MIN(CASE rn WHEN 3 THEN menu_nm END) top3
     , MIN(CASE rn WHEN 4 THEN menu_nm END) top4
     , MIN(CASE rn WHEN 5 THEN menu_nm END) top5
     , IFNULL(SUM(cnt1), 0) cnt_00_06
     , IFNULL(SUM(cnt2), 0) cnt_06_09
     , IFNULL(SUM(cnt3), 0) cnt_09_13
     , IFNULL(SUM(cnt4), 0) cnt_13_16
     , IFNULL(SUM(cnt5), 0) cnt_16_19
     , IFNULL(SUM(cnt6), 0) cnt_19_21
     , IFNULL(SUM(cnt7), 0) cnt_21_24
  FROM (SELECT ymd
             , usr_no
             , menu_nm
             , ROW_NUMBER() OVER(PARTITION BY ymd, usr_no
                                     ORDER BY COUNT(*) DESC, menu_nm) rn
             , COUNT(CASE WHEN hh >= '00' AND hh < '06' THEN 1 END) cnt1
             , COUNT(CASE WHEN hh >= '06' AND hh < '09' THEN 1 END) cnt2
             , COUNT(CASE WHEN hh >= '09' AND hh < '13' THEN 1 END) cnt3
             , COUNT(CASE WHEN hh >= '13' AND hh < '16' THEN 1 END) cnt4
             , COUNT(CASE WHEN hh >= '16' AND hh < '19' THEN 1 END) cnt5
             , COUNT(CASE WHEN hh >= '19' AND hh < '21' THEN 1 END) cnt6
             , COUNT(CASE WHEN hh >= '21' AND hh < '24' THEN 1 END) cnt7
          FROM (SELECT usr_no
                     , menu_nm
                     . SUBSTR(log_tktm, 1, 8) ymd
                     , SUBSTR(log_tktm, 9, 2) hh
                  FROM t
                 WHERE menu_nm NOR IN ('login', 'logout')
                ) a
         GROUP BY ymd, usr_no, menu_nm
        ) a
 GROUP BY ymd, usr_no
;

 

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