2009-09-01 2 views
5

각 열이 다른 테이블의 열에있는 고유 값의 수인 테이블을 반환하는 쿼리가 필요합니다. 난 그냥이 정말로 긴 select 절 만들 수 있다고 가정SQL : 모든 열의 고유 한 값의 수입니다.

select count(distinct columnA) from table1; 

:

나는 하나의 열에서 고유 한 값을 계산하는 방법을 알고

select count(distinct columnA), count(distinct columnB), ... from table1; 

을하지만 매우 아니다 우아하고 하드 코딩되어 있습니다. 좀 더 융통성있는 것을 선호합니다.

+1

이것은 우아하고 간단한 솔루션입니다 ... "테이블 이름이 주어지면 해당 테이블의 각 열에 대해 고유 한 수를 알려주십시오"라는 의미입니까? – gbn

+1

어떤 데이터베이스를 사용하고 있습니까? –

+0

가능한 중복 : http://stackoverflow.com/questions/1330692/distinct-pair-of-values-sql –

답변

0

나는 모든 응답을 주셔서 감사합니다. 이 상황에서 가장 잘 작동하는 솔루션은 다음과 같습니다 (이름을 제외한 테이블에 대한 지식이없는 외부 프로그램에서 테이블의 각 열에있는 고유 한 값의 수를 계산 함)는 다음과 같습니다.

실행 "table1"을 설명하고 결과에서 열 이름을 추출합니다.

열 이름을 반복하고 각 열의 고유 값을 계산하는 쿼리를 만듭니다. 쿼리는 "select count (distinct columnA), count (distinct columnB), ... from table1"과 같이 보입니다.

1

이 코드는 'table1'의 모든 열에 대해 각각의 고유 한 값을 데이터로 제공해야합니다.

DECLARE @TableName VarChar (Max) = 'table1' 
DECLARE @SqlString VarChar (Max) 

set @SqlString = (
    SELECT DISTINCT 
    'SELECT ' + 
     RIGHT (ColumnList, LEN (ColumnList)-1) + 
     ' FROM ' + Table_Name 
    FROM INFORMATION_SCHEMA.COLUMNS COL1 
     CROSS AppLy (
     SELECT ', COUNT (DISTINCT [' + COLUMN_NAME + ']) AS ' + '''' + COLUMN_NAME + '''' 
      FROM INFORMATION_SCHEMA.COLUMNS COL2 
      WHERE COL1.TABLE_NAME = COL2.TABLE_NAME 
      FOR XML PATH ('') 
    ) TableColumns (ColumnList) 
    WHERE 
     1=1 AND 
     COL1.TABLE_NAME = @TableName 
) 

EXECUTE (@SqlString) 
1

그것은 하드입니다.

SQL 문에 대한 필드 목록을 제공하는 것은 하드 코딩되지 않습니다. 그것은 일반적이며 받아 들일만한 관행입니다.

+0

... 프로그래밍 방식으로 SQL을 작성하는 것처럼, 사용자가 입력 한 값을 절대 입력하지 않는다면 (이 질문에 대해서는 괜찮습니다. 어딘가에 열 목록이 있습니다.) – ijw

+0

일부 SQL 코드를 작성하려고하고 MSSqlServer에 있다면 sysobjects 및 syscolumns를 확인합니다. –

+0

코드를 더 이식성있게 작성하려면 Information_Schema.Tables 및 Information_Schema 중에서 선택해야합니다.sysobjects 및 syscolumns에서 선택하는 것이 아니라 열 – Kibbee

-3

DISTINCT는 악마입니다. DOUNT/GROUP BY

+0

자세한 내용을 적어주십시오. 어떻게 COUNT/GROUP BY를 수행 할 때 별개의 악을 사용합니까? – Kibbee

+0

DISTINCT는 더 큰 데이터 세트 및 플랫폼에서 플랫폼으로 비정상적으로 작동합니다. 적어도 내 경험에서. 특히 그룹화 된 데이터, UTF 등을 다루는 경우 그룹화 결과가 더 예측 가능하다는 것을 알게되었습니다. –

+0

by group by을 사용하여 조사해야합니다. – Ryan

0

이것은 테이블의 모든 필드에 대해 반드시 가능하지는 않습니다. 예를 들어, 다른 데이터 형식으로 변환하고 정밀도를 잃지 않는 한 SQL Server ntext 또는 image 필드에 대해 DISTINCT를 수행 할 수 없습니다.

+0

좋은 지점에 있습니다. 나는 이것에 대해 걱정할 필요가 없다. 필드는 텍스트 또는 숫자 일뿐입니다. – Ryan

3

이 (SQL 서버 2005 구문을) 시도 :

DECLARE @YourTable table (col1 varchar(5) 
         ,col2 int 
         ,col3 datetime 
         ,col4 char(3) 
         ) 

insert into @YourTable values ('abcdf',123,'1/1/2009','aaa') 
insert into @YourTable values ('aaaaa',456,'1/2/2009','bbb') 
insert into @YourTable values ('bbbbb',789,'1/3/2009','aaa') 
insert into @YourTable values ('ccccc',789,'1/4/2009','bbb') 
insert into @YourTable values ('aaaaa',789,'1/5/2009','aaa') 
insert into @YourTable values ('abcdf',789,'1/6/2009','aaa') 


;with RankedYourTable AS 
(
SELECT 
    ROW_NUMBER() OVER(PARTITION by col1 order by col1) AS col1Rank 
     ,ROW_NUMBER() OVER(PARTITION by col2 order by col2) AS col2Rank 
     ,ROW_NUMBER() OVER(PARTITION by col3 order by col3) AS col3Rank 
     ,ROW_NUMBER() OVER(PARTITION by col4 order by col4) AS col4Rank 
    FROM @YourTable 
) 
SELECT 
    SUM(CASE WHEN  col1Rank=1 THEN 1 ELSE 0 END) AS col1DistinctCount 
     ,SUM(CASE WHEN col2Rank=1 THEN 1 ELSE 0 END) AS col2DistinctCount 
     ,SUM(CASE WHEN col3Rank=1 THEN 1 ELSE 0 END) AS col3DistinctCount 
     ,SUM(CASE WHEN col4Rank=1 THEN 1 ELSE 0 END) AS col4DistinctCount 
    FROM RankedYourTable 

출력 :

col1DistinctCount col2DistinctCount col3DistinctCount col4DistinctCount 
----------------- ----------------- ----------------- ----------------- 
4     3     6     2 

(1 row(s) affected) 
+0

+1 : 간결하고 우아하며 건방진 ... – gbn

관련 문제