select distinct, group by having count...펌
mysql에서 group by 와 distinct
- iiebig
- 2006.07.04 21:18
- 답변
- 1
- 조회
- 11,580
SELECT count( DISTINCT column1 ) cnt, column2
FROM Tab
GROUP BY column2
SELECT count( *) cnt, column2
FROM Tab
GROUP BY column1, column2
두 쿼리의 차이가 몰까요???
갯수가 동일하게 나올거라 생각했는데, distinct 한 갯수가 훨씬 적게 나오더라구요...
예를 들어,,,
Tab 테이블에 column1 에는 a, a, b, c 가 들어있고
column2 에는 1, 1, 2, 3 이 있다고 가정하면,,,
첫 번째 쿼리에서는...
column2 를 group by 하니깐, 1, 2, 3이 나올거고, 거기에 distinct column1 이니깐, a, b, c 가 나오겠죠 ?
아래 쿼리에서는 우선 column1 을 group by 하니깐, a, b, c가 올 거고 거기에 column2 를 group by 하니깐, 1, 2, 3이 나올거라 생각되는데요...
그래서, 결과가 같아야 한다고 생각하는데요...
제 생각이 잘못됐거든요...
어디가 잘못 됐을까요 ???
질문자 채택된 경우, 추가 답변 등록이 불가합니다.
distinct 명령어는 지정된 컬럼에 같은 값이 안오도록 하는 것입니다.
만약에 A 컬럼값이 1, 1, 1, 2, 2, 3, 4, 4, 5 라는 값이 들어와 있을 경우에
1, 2, 3, 4, 5 값만이 검색되 나오는 것입니다.
외 원하는 값이 안나오는가 하면요.
col1 col 2 col3
row1 A 1 N
row2 A 1 Y
row3 B 2 N
row4 B 2 Y
row5 C 3 N
만약 이런 값이 디비에 들어가있을경우
select distinct col1 from table 하실경우
A
B
C
라는 값을 얻으실 수 있습니다.
그리고
select distinct col1, col2 from table 하실경우에도
A 1
B 2
C 3
이라는 값을 얻을 수 있습니다.
하지만
select distinct col1, col2, col3 from table 하실경우에는
A 1 N
A 1 Y
B 2 N
B 2 Y
C 3 N
이유는 DISTINCT 는 하나의 ROW 값의 유니크한 값을 가져오기
때문에 각 컬럼의 값들을 더했을경우 각각의 ROW값이 유일한
값이 되기 때문에 그렇게 됩니다.
그러므로 이때 원하는 값을 가지고 싶을경우 기준이 되는 값을
정하고 나머지 값에는 그 기준이 되는 값에 따라 상이한 값을
가질경우 어떠한 값으로 뿌려질지 결정해 주어야 합니다.
SELECT
DISTINCT COL1, MAX(COL2), MAX(COL3)
FROM TABLE
GROUP BY COL1
여기서 MAX 값은 COL1이 A일경우 COL3값이
N, Y를 가지므로 DISTINCT로 인하여 A값만을
가져올경우 어떠한 값을 취할지 결정해 주는
것입니다. MAX는 큰값을 취하라는 명령어구요
물론 MIN도 취할수 있으며 각종 수식어를
취하여 유니크 하게 만들어 주시면 됩니다.
[SQL]'select distinct'와 반대로 '중복되고 있는' 데이터만 골라내기
- saraband
- 2006.06.16 17:10
- 답변
- 1
- 조회
- 4,525
아래와 같이 테이블이 있씁니다.
'Test' 테이블
Col1
====
AAA
BBB
CCC
DDD
AAA
EEE
FFF
DDD
GGG
HHH
JJJ
CCC
...
'select distinct colA from Test' 하게 되면 고유한 것들만 뽑아지죠.
근데, 반대로
AAA
DDD
CCC
..
이렇게 "고유하지 않은" 데이터들만 골라내려면 어떻게 쿼리를 써야 하나요?
즉, 한 칼럼에서, 자기 말고 똑같은 다른 넘이 있는, 중복되고 있는 데이터들만 뽑아서 보고 싶은 것입니다.
부디 지도 부탁드립니다. 감사합니다.
질문자 채택된 경우, 추가 답변 등록이 불가합니다.
질문자 인사
두번째 쿼리 "select * from test1 where in..." 에서 "where in" 사이에 col1이 빠진 것 같네요. 감사합니다.
select col1
from test1
group by col1
having count(col1) > 1
col1를 그룹핑해서 2개이상인것만 가지고 오라는 형식입니다.
- 추가
위는 중복되는 데이터를 한개씩만 보여줍니다.
만약 중복되고 있는 모든 데이터를 보고 싶다면
select * from test1 where in (
select col1
from test1
group by col1
having count(col1) > 1 )
이렇게 하시면됩니다.