database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 6289 게시물 읽기
No. 6289
max 값 조인시 중복 제거 문의드립니다.
작성자
졸려요ㅠㅠ
작성일
2011-12-12 16:11
조회수
9,747

 

안녕하세요

max값 조인시에 중복제거가 잘 안되서 이렇게 도움을 부탁드립니다

A 테이블에는 사용자 정보가 저장되어있습니다.

B 정보에는 사용자가 로그인한 기록이 저장되어있습니다

(한 사용자마다 여러 행의 정보가 있습니다)

이중에 inner 조인으로 가장 최근날짜의 로그인 데이터를 출력하고자 하였습니다

현재 작성한 query 는

날짜정보저장 필드는 DATETIME 입니다.

select a.ID, a.name,convert(varhar(12),max(b.logdate),23) date from user a  left join date b

on a.id=b.id where a.logyn='Y'

gropu by a.id, a.name, b.logdate 

의 query 도 사용해보고

여러 쿼리를 사용해 봤지만

로그인한 전체 데이터가 다 출력이 되어서

계속 헤매고 있습니다

선배님들의 조언 부탁드려요 ㅠㅠ

 

 

이 글에 대한 댓글이 총 6건 있습니다.

 대략 보니 ID도 MAX로 하고 그 MAX값으로 JOIN을 해야 할 듯. 

.님이 2011-12-12 19:15에 작성한 댓글입니다. Edit

group by 에서 b.logdate만 빼면 될것 같습니다. 

select a.ID, a.name, convert(varhar(12),max(b.logdate),23) date
  from user a  left join date b on a.id=b.id
 where a.logyn='Y'
 group by a.id, a.name

 

그리고 LEFT JOIN 하여서 Date 테이블에 정보가 없어도 나옵니다.

있을때만 나오게 할려면

left join --> inner join 하면 되구요

착한넘(agoodman99)님이 2011-12-12 19:52에 작성한 댓글입니다.
이 댓글은 2011-12-12 19:54에 마지막으로 수정되었습니다.

답변감사합니다 ㅠㅠ

그런데 logdate를 group by  에서 빼면 데이터 량에서만 차이가 조금 날뿐

중복이 제거되지는 않는것 같습니다..

테이블 구조가

B테이블에는

물건구입회원

유령회원

가족회원

이렇게 회원구분이 되어있고

각 회원들 마다 마지막 로그인 날짜를 볼려고 하는건데...

말씀해주신것 처럼 그냥 inner join 이면

A테이블의 전체 회원이 다 나와야하는데

A테이블 전체회원은 안나오고

B테이블의 회원들만 중복이 되어서 나오네요 ㅠㅠ

졸려요님이 2011-12-13 08:16에 작성한 댓글입니다. Edit

전체회원에 대해 보실려면 left join를 하시는게 맞습니다.

A 테이블에서 한 ID에 여러개의 Name이 들어갈수 있나요??

절대 중복데이터가 나올수 없는 쿼리인데..

그럼 테이블 레이아웃을 좀 올려주세요

 

착한넘(agoodman99)님이 2011-12-13 09:12에 작성한 댓글입니다.

 

답변감사합니다

다시 글을보고 테이블구조와 제가 올린 질문글을보니

제가 질문을 난해하게 잘못한거 같아서

말씀해주신것 처럼 테이블 레이아웃과

출력하고자 하는 date를 다시한번 말씀드리겠습니다.

우선 테이블 레이아웃입니다

 

테이블A Column
사용자ID ID
사용자이름 Name
   

       

테이블B(로그) Column
사용자ID ID
   
로그 날짜 LogDate
로그 타입 Log
   
   
   

 

 

 

 

 

 

 

 

 

두 테이블이 있는데 로그 테이블에는 여러가지의 로그가 사용중입니다.

제가 필요한 정보는 "로그인 타입1"으로 시작하는 로그와  "로그인 타입2"으로 시작하는 로그중

가장 최신의 로그만 걸러내고 싶습니다.

사용자 1 - 로그인 타입1

사용자 2 - 로그인 타입2 (로그인 타입 1, 2 중 가장 최신 로그)

이렇게 가장 마지막으로 로그인한  logdate를 출력하고자 합니다

그런데

회원의 로그인 타입에 따라

1 회원의 Log 필드에 따라 3개의 행이 존재할때

3개의 행 모두 출력이 되버립니다(중복)

3개의 행중 가장 최근의 logdate인 행만 가지고 와야하는데.. ㅠㅠ

처음부터 제대로 질문을 드렸어야 하는데

죄송합니다... ㅜㅜ

 

 

 

 

졸려요님이 2011-12-13 10:34에 작성한 댓글입니다.
이 댓글은 2011-12-13 10:34에 마지막으로 수정되었습니다. Edit

 

A테이블

ID Name
1  홍길동
2  아무개
3

 너구리

 

B테이블

 

ID

LogDate Log
1 2011-12-10 12:00:000 1
1 2011-12-12 10:00:000 2
2 2011-12-09 12:00:000 3
2 2011-12-11 11:00:000 1

이런식으로 되어 있는게 맞나요??

SELECT a.ID, a.Name, ISNULL(MAX(CONVERT(VARCHAR(12),b.logdate,23)),'로그없음') Date
  FROM a
        LEFT JOIN b ON a.ID = b.ID AND b.Log IN ('1','2')
 GROUP BY a.ID, a.Name

이렇게 해도 안나온다면

 

실제 쿼리를 보여주던지 아니면 샘플 데이터를 보여주세요

 

ㅁ님이 2011-12-13 13:36에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6294프로시저로 실행된 sql 로그보기
초보
2011-12-20
7615
6293테이블에서 문자열 검색하고 정렬하는 SQL문 도와주세요 [4]
강공주
2011-12-15
6757
6290SSIS~
2011-12-13
6007
6289max 값 조인시 중복 제거 문의드립니다. [6]
졸려요ㅠㅠ
2011-12-12
9747
6288테이블 정보 보기 [1]
초보
2011-12-12
6285
6285ms sql 을 mysql 로 이관 하려고 합니다... 여러가지 좀 알려주세요ㅠ.ㅜ
박순채
2011-12-11
6276
6284SQL문 소숫점!! [2]
kongsu
2011-12-10
6395
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.027초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다