mysql 한개의 칼럼 기준으로 그룹짓고 갯수를 얻은 후 다른 테이블과 join하고 싶습니다.

조회수 594회

A테이블에서 ID를 기준으로 GROUP지었습니다.


SELECT TOP 200 A.ID,COUNT(A.ID) AS CNT

  FROM A  A
  LEFT join ANAME as Aname on A.ID = Aname.ID
  LEFT join BNAME as Bname on Aname.SEQ = Bname.SEQ
  where A.POI_ID > 1

이렇게 해서 A테이블 상위 200개에 대하여 A.ID와 각 ID의 갯수를 CNT로 구했는데요.

이제 이 A.ID 를 기준으로 Aname,Bname 테이블과 조인을 하고 싶습니다.

A.ID, A.CNT, Aname.NAME, Bname.가입날짜 이렇게 네개가 나왔으면 좋겠는데,

SELECT FROM (SELECT ~) 로 구하니까 A.ID가 중복되는것들이 나오더라고요.

A테이블
--------------------
ID|지역

1|서울

2|인천

3|경기

1|SEOUL

2|INCHEON
Aname테이블
---------------------
ID|name

1|대한

2|민국

3|파리

4|북한
Bname테이블
---------------------
ID|가입날짜

1|200101

2|990101

3|901007
원하는 값
-----------
ID|CNT|NAME|가입날짜

1|2|대한|200101

2|2|민국|990101

3|1|북한|901007

A.ID기준으로 중복되는 갯수를 구하고, 중복되지않는 ID만 뽑아서 JOIN 해야 합니다. 도와주세요~~

  • 죄송하지만 "원하는 값" 부분을 신뢰할 수가 없습니다. '북한' 자료가 왜 뽑혀나와야 하는 건지 모르겠습니다. 북한에 악감정은 없지만... 엽토군 2020.7.28 22:08

1 답변

  • SELECT TOP 200 A.ID,COUNT(A.ID) AS CNT
    
      FROM A  A
      LEFT join ANAME as Aname on A.ID = Aname.ID
      LEFT join BNAME as Bname on Aname.SEQ = Bname.SEQ
      where A.POI_ID > 1
    

    이 쿼리 돌리면 1rows 만 나오지 않나요?

    SELECT A.ID,COUNT(A.ID) AS CNT, Aname.name, Bname.가입날짜
      FROM A  A
      LEFT join ANAME as Aname on A.ID = Aname.ID
      LEFT join BNAME as Bname on Aname.SEQ = Bname.SEQ
      where A.POI_ID > 1 group by a.id;
    

    하시면 중복된 값이 있을 경우 첫번째 행의 값 기준으로 될꺼예요.

    • 제가 예시에는 테이블 칼럼을 하나씩 적어놨는데, 테이블당 칼럼이 열댓개씩 있거든요. 그래서 그런지 GROUP BY절로 묶으면 Bname테이블의 다른 칼럼이 group by 절에 없으므로 select 목록에서 사용할 수 없습니다. 에러가 발생합니다 알 수 없는 사용자 2020.7.28 16:11
    • 보여주신 예제에 대한 답변이고 그게 작성자님이 고민하시는 내용이라 판단해서 답변드렸는데 작성자님이 진행중인 DB의 스키마에 대해서 공개 하지 않았는데 제가 어찌 그에 맞춰서 답변드립니까..; 김호원 2020.7.29 10:02

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)