2009-09-01 17 views
5

各列が別の表の列の個別値の数である表を戻す問合せが必要です。SQL:各列の異なる値のカウント数

私は1つの列に異なる値をカウントする方法を知っている:

select count(distinct columnA) from table1; 

私はちょうどこの本当に長いselect句作ることができることとします

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

私はグループを使って調べる必要があります。 – Ryan

0

これは必ずしもテーブルのすべてのフィールドで可能であるとは限りません。たとえば、SQL Serverのntextまたはimageフィールドに対してDISTINCTを実行することはできません。別のデータ型にキャストして精度を落とさない限り、DISTINCTは実行できません。

+0

良い点で正しいトラックにあります。私はこれについて心配する必要はありません。フィールドはテキストまたは数字のみです。 – Ryan

3

は(SQL Server 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 

OUTPUT:

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

(1 row(s) affected) 
+0

+1:簡潔でエレガントで、素敵な... – gbn

関連する問題