쿼리 질문 드립니다. 0 2 1,782

by 리치 [SQL Query] group by count [2020.02.13 18:27:53]


안녕하세요. 쿼리 작성을 하는 중인데 잘 안되서 도움을 요청 드립니다.

 

테이블은 두개가 있습니다.

TABLE : BOOK

MEMBR_SEQ BOOK DATE
7825 950106-00183EF 2020-02-13 13:23
2206 950106-01847EF 2020-02-13 14:36
7826 K1049549EF 2020-02-13 16:15
2206 950106-01231EF 2020-02-13 16:15
7826 K1049154EF 2020-02-13 16:20

TABLE : LOG

MEMBR_SEQ DATE
2206 2020-02-13 17:43
2206 2020-02-13 17:43
6784 2020-02-13 17:43
7825 2020-02-13 17:44
7825 2020-02-13 17:44
5002 2020-02-13 17:49
7826 2020-02-13 17:50
7826 2020-02-13 17:50
7826 2020-02-13 17:50
7826 2020-02-13 17:50

 

원하는 것은 아래와 같습니다.

1. BOOK 테이블의 MEMBR_SEQ 별로 DATE 마지막 날짜의 BOOK 정보를 추출합니다.

MEMBR_SEQ BOOK
7826 K1049154EF
2206 950106-01231EF
7825 950106-00183EF

2. LOG 테이블에 1번 결과를 조인해서 BOOK 정보를 가져옵니다.

MEMBR_SEQ BOOK DATE
2206 950106-01231EF 2020-02-13 17:43
2206 950106-01231EF 2020-02-13 17:43
6784 null 2020-02-13 17:43
7825 950106-00183EF 2020-02-13 17:44
7825 950106-00183EF 2020-02-13 17:44
5002 null 2020-02-13 17:49
7826 K1049154EF 2020-02-13 17:50
7826 K1049154EF 2020-02-13 17:50
7826 K1049154EF 2020-02-13 17:50
7826 K1049154EF 2020-02-13 17:50

3. 2에서 BOOK을 기준으로 GROUP BY 해서 카운트를 합니다.

그래서 최종은 아래와 같이 뽑고 싶습니다.

BOOK COUNT
950106-01231EF 2
950106-00183EF 2
K1049154EF 4
null 2

 

한참을 삽질해 보았지만, 제 짧은 지식으로는 원하는 결과를 구할 수 가 없네요.

쿼리에 도움 주시거나 해결을 위한 힌트라도 알려주신 다면 감사하겠습니다.

by 마농 [2020.02.13 21:01:07]
WITH book_t AS
(
SELECT 7825 membr_seq, '950106-00183EF' book, '2020-02-13 13:23' dt FROM dual
UNION ALL SELECT 2206, '950106-01847EF', '2020-02-13 14:36' FROM dual
UNION ALL SELECT 7826, 'K1049549EF'    , '2020-02-13 16:15' FROM dual
UNION ALL SELECT 2206, '950106-01231EF', '2020-02-13 16:15' FROM dual
UNION ALL SELECT 7826, 'K1049154EF'    , '2020-02-13 16:20' FROM dual
)
, log_t AS
(
SELECT 2206 membr_seq, '2020-02-13 17:43' dt FROM dual
UNION ALL SELECT 2206, '2020-02-13 17:43' FROM dual
UNION ALL SELECT 6784, '2020-02-13 17:43' FROM dual
UNION ALL SELECT 7825, '2020-02-13 17:44' FROM dual
UNION ALL SELECT 7825, '2020-02-13 17:44' FROM dual
UNION ALL SELECT 5002, '2020-02-13 17:49' FROM dual
UNION ALL SELECT 7826, '2020-02-13 17:50' FROM dual
UNION ALL SELECT 7826, '2020-02-13 17:50' FROM dual
UNION ALL SELECT 7826, '2020-02-13 17:50' FROM dual
UNION ALL SELECT 7826, '2020-02-13 17:50' FROM dual
)
SELECT b.book
     , COUNT(*) cnt
  FROM log_t a
     , (SELECT membr_seq, book
          FROM (SELECT membr_seq, book
                     , ROW_NUMBER() OVER(PARTITION BY membr_seq ORDER BY dt DESC) rn
                  FROM book_t
                )
         WHERE rn = 1
        ) b
 WHERE a.membr_seq = b.membr_seq(+)
 GROUP BY b.book
;

 


by 리치 [2020.02.14 08:56:39]

알려주신 쿼리로 해결할 수 있게 되었습니다.

도움 감사합니다.

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