7

各列が別のテーブルの列の個別の値の数であるテーブルを返すクエリが必要です。

1 つの列で個別の値を数える方法を知っています。

select count(distinct columnA) from table1;

これを非常に長いselect句にすることができたと思います:

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

しかし、それはあまりエレガントではなく、ハードコードされています。もっと柔軟なものがいいです。

4

6 に答える 6

4

これを試してください(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

出力:

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

(1 row(s) affected)
于 2009-09-01T18:16:46.783 に答える
3

このコードは、「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)
于 2009-09-01T17:09:53.940 に答える
1

そしてそれはハードコードされています。

SQL ステートメントにフィールド リストを提供することは、ハードコーディングではありません。これは一般的で許容される慣行です。

于 2009-09-01T17:14:35.537 に答える
0

これは、テーブル内のすべてのフィールドで必ずしも可能ではありません。たとえば、SQL Server の ntext または image フィールドに対して DISTINCT を実行することはできません。ただし、それらを他のデータ型にキャストして精度をいくらか失う場合を除きます。

于 2009-09-01T18:01:02.853 に答える
-1

すべての回答に感謝します。この状況(名前以外にテーブルの知識がない外部プログラムから、テーブルの各列の個別の値の数をカウントする)で私にとって最適な解決策は次のとおりです。

「describe table1」を実行し、結果から列名を引き出します。

列名をループして、各列の個別の値をカウントするクエリを作成します。クエリは、「select count(distinct columnA), count(distinct columnB), ... from table1」のようなものになります。

于 2009-09-03T15:20:23.750 に答える
-3

DISTINCTは悪です。COUNT /GROUPBYを実行します

于 2009-09-01T17:47:11.167 に答える