7

私はSQLServer2005を使用しています。以下のクエリ(実際のクエリから簡略化)を使用すると、次のようになります。

select a,count(distinct b),sum(a) from 
(select 1 a,1 b union all
select 2,2 union all
select 2,null union all
select 3,3 union all
select 3,null union all
select 3,null) a
group by a

取得せずに明確なカウントを行う方法はありますか

「警告:NULL値は、集計またはその他のSET操作によって削除されます。」

これが私が考えることができる選択肢です:

  1. ANSI_WARNINGSをオフにする
  2. 2つのクエリに分けます。1つはカウントが異なり、もう1つはnullを削除するwhere句で、もう1つは合計です。

    select t1.a, t1.countdistinctb, t2.suma from
    (
        select a,count(distinct b) countdistinctb from 
        (
            select 1 a,1 b union all
            select 2,2 union all
            select 2,null union all
            select 3,3 union all
            select 3,null union all
            select 3,null
        ) a
        where a.b is not null
        group by a
    ) t1
    left join
    (
        select a,sum(a) suma from 
        (
            select 1 a,1 b union all
            select 2,2 union all
            select 2,null union all
            select 3,3 union all
            select 3,null union all
            select 3,null
        ) a
        group by a
    ) t2 on t1.a=t2.a
    
  3. クライアントの警告を無視する

これを行うためのより良い方法はありますか?私はおそらくルート2を下りますが、コードの重複は好きではありません。

4

4 に答える 4

6
select a,count(distinct isnull(b,-1))-sum(distinct case when b is null then 1 else 0 end),sum(a) from 
    (select 1 a,1 b union all
    select 2,2 union all
    select 2,null union all
    select 3,3 union all
    select 3,null union all
    select 3,null) a
    group by a

Eoin のおかげで、私はこれを行う方法を見つけました。ヌルを含む値を個別にカウントし、合計個別を使用してヌルがあった場合は、ヌルによるカウントを削除できます。

于 2009-05-12T09:29:58.930 に答える
2

nullが返される可能性がある場合は、次を使用します。

CASE WHEN Column IS NULL THEN -1 ELSE Column END AS Column

これにより、クエリの期間中、-1のすべてのヌル値が除外され、そのようにカウント/集計されます。その後、ファインラッピングクエリで逆の操作を行うことができます...

SELECT  
    CASE WHEN t1.a = -1 THEN NULL ELSE t1.a END as a
    , t1.countdistinctb
    , t2.suma
于 2009-05-12T08:00:44.427 に答える
2

これは遅れたメモですが、Google での復帰だったので、言及したいと思いました。

NULL を別の値に変更することは悪い考え(tm)です。

DISTINCT ではなく、COUNT() が実行しています。

代わりに、数値を返すサブクエリで DISTINCT を使用し、それを外側のクエリで集計します。

これの簡単な例は次のとおりです。

WITH A(A) AS (SELECT NULL UNION ALL SELECT NULL UNION ALL SELECT 1)
SELECT COUNT(*) FROM (SELECT DISTINCT A FROM A) B;

これにより、COUNT(*)NULL を無視しない (値ではなくレコードをカウントするため) を使用できます。

于 2011-10-25T18:37:09.193 に答える
1

コードの重複が気に入らない場合は、一般的なテーブル式を使用してみませんか?例えば

WITH x(a, b) AS 
        (
                select 1 a,1 b union all
                select 2,2 union all
                select 2,null union all
                select 3,3 union all
                select 3,null union all
                select 3,null
        ) 
select t1.a, t1.countdistinctb, t2.suma from
(
        select a,count(distinct b) countdistinctb from 
        x a
        where a.b is not null
        group by a
) t1
left join
(
        select a,sum(a) suma from 
        x a
        group by a
) t2 on t1.a=t2.a
于 2009-05-12T09:41:19.193 に答える