質問

私が使っているSQL Server2005年.のクエリを以下に簡便からの私のリクエリ):

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値により、集合体又はその他の設定.jp/に掲載しています。

ここでは代替できると思い:

  1. 旋ANSI_WARNINGS off
  2. 分離のクエリは、カウントとは異なったwhere句をnullが、和:

    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、がんのようなコードの複製.

役に立ちましたか?

解決

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に感謝します。あなたはヌルを含む個別の値をカウントし、個別の合計を使用して、任意のあった場合、その後に起因ヌルに数を削除することができます。

他のヒント

どこでも、あなたはおそらく、

を使用し、ヌルを返しました
CASE WHEN Column IS NULL THEN -1 ELSE Column END AS Column

クエリの期間中、-1のため、すべてのNULL値のサブアウトし、彼らは/のような集約されたカウントされますが、その後、あなたは自分の細かいラッピングクエリでの逆を行うことができます...

SELECT  
    CASE WHEN t1.a = -1 THEN NULL ELSE t1.a END as a
    , t1.countdistinctb
    , t2.suma

この後半のノートですが、それはGoogleでのリターンだったので、私はそれを言及したかっます。

別の値にNULL変更悪いアイデア(登録商標)である。

COUNT()はDISTINCT、それをやっていないされます。

の代わりに、サブクエリで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を無視しない、使用することが可能になります。

共通テーブル式を使用しないで、なぜあなたは、コードの重複を好きではない場合は?例えば

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top