최상의 답변
SQL에서 DISTINCT 절을 *** 선택 목록 전에 *** 사용할 수 있습니다. 출력에서 중복 행을 방지하거나 집계 함수 (예 : COUNT) *** 내부 ***. 두 번째 경우, 특히 COUNT의 경우 효과는 값을 한 번만 반복하는 것입니다. 한 가지 해결책은 Greg Kemnitz가 제안한 연결을 사용하는 것입니다. 단, 다른 SQL 엔진의 열 유형 및 문자열 함수에 따른 작은 실수와 적응을 제외하면
SELECT COUNT (DISTINCT CONCAT (col1, …. , col3)) FROM table;
쉬운 솔루션
SELECT COUNT (DISTINCT col1, col2, col3) FROM table;
MySQL에서 작동하지만 그렇지 않습니다. DB2에서 작업하고 다른 엔진에 대해서는 잘 모르지만 표준 SQL은 아닙니다.
작업이 빈번하고 적절하게 최적화되면 더 효과적 일 수있는 또 다른 더 복잡한 솔루션은 다음을 생성해야합니다. 보기
CREATE VIEW vw AS SELECT DISTINCT col1, col2, col3 GROUP BY col1, col2, col3; SELECT COUNT (*) FROM vw;
Answer
mysql> create table fake (foo tinyint (3) not null default 0, bar varchar (64) not null default “”) ; 쿼리 OK, 영향을받는 행 0 개 (0.07 초)
mysql> 가짜 값에 삽입 (1, “foo”), (1, “bar”), (2, “foo”), (2, “bar”), (3, “baz”), (3, “for”); 쿼리 OK, 6 개 행 영향 (0.00 초) 레코드 : 6 개 중복 : 0 경고 : 0
mysql> select foo, bar, count (*) from fake group by foo, bar; + —– + —– + ———- + | foo | 바 | 개수 (*) | + —– + —– + ———- + | 1 | 바 | 1 | | 1 | foo | 1 | | 2 | 바 | 1 | | 2 | foo | 1 | | 3 | baz | 1 | | 3 | 에 대한 | 1 | + —– + —– + ———- + 6 행 세트 (0.00 초)
mysql> 가짜 값에 삽입 (1, “foo “), (1,”bar “), (2,”foo “), (2,”bar “), (3,”baz “), (3,”for “); 쿼리 OK, 6 개 행 영향 (0.00 초) 레코드 : 6 개 중복 : 0 경고 : 0
mysql> select foo, bar, count (*) from fake group by foo, bar; + —– + —– + ———- + | foo | 바 | 개수 (*) | + —– + —– + ———- + | 1 | 바 | 2 | | 1 | foo | 2 | | 2 | 바 | 2 | | 2 | foo | 2 | | 3 | baz | 2 | | 3 | 에 대한 | 2 | + —– + —– + ———- + 6 행 세트 (0.00 초)
mysql>