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
운영게시판
최근게시물
MySQL Q&A 30743 게시물 읽기
No. 30743
중복 필터링 쿼리 질문입니다.
작성자
더페이퍼
작성일
2014-07-25 18:22ⓒ
2014-07-25 23:27ⓜ
조회수
8,675

중복필터링을 아래와 같은 원데이터 -> 결과데이터로 만들려고 하는데

아무리 쥐어짜봐도 제 머리로는 한계가 오네요 ㅠㅠ

고수님들 도와주세요.

 

원데이터

col1 col2 col3 col4
일가 일나 일다 일라
이가 이나 이다 일라
삼가 삼나   이라
사가 사나   이라
오가 삼나   이라
일가 삼나    
이가 사나    
  오나    
  육나    

결과데이터

 col1 cnt1 col2  cnt2  col3  cnt3  col4  cnt4 
 일가  일나  일다 1  일라
 일가  이나  이다 1  일라
 이가  삼나      이라 3
 이가  삼나      이라 3
 삼가  삼나      이라 3 
 사가  사나         
 오가  사나         
     오나         
     육나        

 

 

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

 다음과 같이 각 컬럼별로 count 구하는 질의를 UNION으로 묶는 방법이 젤 편해 보입니다.

vertical한 결과를 horizontal하게 바꾸는 건 client 측에서 변경하면 되고요.

SELECT 'col1' AS col_name, t1.col1, t2.cnt
FROM tab AS t1 INNER JOIN (
    SELECT col1, COUNT(*) AS cnt
    FROM tab
    GROUP BY col1
) t2 ON t1.col1 = t2.col1
 
UNION ALL
 
SELECT 'col2' AS col_name, t1.col2, t2.cnt
FROM tab AS t1 INNER JOIN (
    SELECT col2, COUNT(*) AS cnt
    FROM tab
    GROUP BY col2
) t2 ON t1.col2 = t2.col2
 
UNION ALL
 
...
 
허정수(wertyu)님이 2014-07-27 11:37에 작성한 댓글입니다.

UNION까지 도달했는데 

vertical한 결과를 horizontal하게 바꾸는 건 client 측에서 변경을 해야하는군요

답변 대단히 감사드립니다. 많은 도움 되었습니다.

더페이퍼님이 2014-07-28 10:38에 작성한 댓글입니다. Edit

 네. SQL로 하시려면 UNION되는 쿼리 4개를 LEFT OUTER JOIN으로 풀어 쓰면 되는데요.

지금 JOIN key로 사용할 조건이 없기 때문에 user variable로 serial한 값을 생성해서 JOIN하면 되는데 가독성도 안 좋고 좀 불편할 것 같습니다 ^^;

 

돌려보진 않았지만 다음의 쿼리 응용하시면 될 듯 합니다.

 

 

    SELECT t1.col, t1.cnt, t2.col, t2.cnt
    FROM (
        SELECT @seq1 := @seq1 + 1 AS seq, col1 AS col, COUNT(*) AS cnt
        FROM tab, (SELECT @seq1 := 0) init
        GROUP BY col1
    ) t1 LEFT JOIN (
        SELECT @seq2 := @seq2 + 1 AS seq, col2 AS col, COUNT(*) AS cnt
        FROM tab, (SELECT @seq2 := 0) init
        GROUP BY col2
    ) t2 ON t1.seq = t2.seq
    ...
 

 

허정수(wertyu)님이 2014-07-28 10:55에 작성한 댓글입니다.

 아... 어떤 컬럼이 unique한 값이 많을지 모르니 left join으로 풀기 어렵겠군요.

 

full outer join으로 풀어야 하는데 mysql에서 full outer join이 지원되지 않아서 union을 해야 하는데 많이 복잡해질 듯 합니다.

허정수(wertyu)님이 2014-07-28 11:24에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
30746두화일조인해서 결과값얻기 [4]
김양훈
2014-08-08
8120
30745조건문이 들어가야하는 구문은 어떻게 해야할까요 [2]
seokhoon
2014-08-04
7964
30744innodb 복제? datafile의 A라는 디비가있는데 그파일로 B를 또하나 생성할수있나요? [2]
성상길
2014-07-29
8170
30743중복 필터링 쿼리 질문입니다. [4]
더페이퍼
2014-07-25
8675
30742테이블 필드 추가 관련해서 질문이요~ [1]
db초보
2014-07-21
8152
30741innodb_file_per_table 옵션을 사용할경우 성능은 어떻게 될까요? [2]
지종현
2014-07-17
9228
30740해당id의 랭킹을 출력하려고 하는데요 [3]
신정연
2014-07-16
9555
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.057초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다