2009-05-12 8 views
5

tarafından elimine edilir: Kont farklı ve null değeri (benim gerçek sorgudan basitleştirilmiş) aşağıda sorgu ile SQL Server 2005 kullanıyorum toplu bir

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 

olmadan ayrı bir sayımını yapmak için herhangi bir yolu var mı

"Uyarı: null değeri bir agrega veya diğer SET işlemi tarafından elimine edilir." alma İki sorguları sayımı farklı olan birine ayırmak

  • kapalı

    1. Torna ANSI_WARNINGS ve toplamı ile tümcesi boş değerlere ortadan kaldırmak için nerede bir tek: Burada

      Aklıma alternatifler

      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 
      
    2. istemci uyarıyı yok say

    Bunu yapmanın daha iyi bir yolu var mı? Muhtemelen rota 2'ye gideceğim, ancak kod çoğaltmasını sevmiyorum. Her yerde

  • +0

    Ben, senin eski kod sadece iyi olduğunu düşünüyorum veritabanı gerektiği bazı programcılar DISTINCT nasıl olsa sayma boş değerlere içermelidir düşünüyorum meyilli olabilir, çünkü bir uyarı yükseltmek yüzden sürprizler değil sorun size. Bu uyarı uyarısı ANSI SQL uyumlu olduğunu düşünüyorum. –

    +0

    Açıklamanız anlamlı. Yine de onlardan uzak durabilirsem uyarıları sevmem. –

    cevap

    5
    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 
    

    Teşekkür tersini yapabilir ben bunu yapmanın bir şekilde çalıştı. Boş sayılar da dahil olmak üzere değerleri ayrı ayrı sayabilir ve herhangi bir toplamı kullanarak herhangi bir boşluğu varsa sayıları kaldırabilirsiniz.

    2

    muhtemelen döndü bir null kullanmasını sağlamak

    CASE WHEN Column IS NULL THEN -1 ELSE Column END AS Column 
    
    sorgu süresince -1 için tüm Null Değerleri dışarı alt ve onlar sayılır/size daha sonra, örneğin toplanmış olacak

    sadece ... senin güzel sarma sorguda Eoin için

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

    İki sorguya ayırıp birleştirmekten kaçınmak istedim. Fikriniz sayesinde çalıştım ama cevap vereceğim. –

    +0

    Bu fikri hiç beğenmedim! Veri geç geldiğinde ne olur? Ya da 'bilinmeyen' tam olarak geçerli bir durumdur? –

    +0

    Özellikle sayımda NULL değerleri eklemek istemediğim bir durum için tasarlıyorum. –

    1

    ortak tablo ifade kullanmaz neden o zaman kod tekrarını beğenmezseniz? Örneğin.

    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 
    
    +0

    Düşünmediğim iyi bir fikir. Ama gerçekten sevmediğim kod çoğaltma, grup tarafından birleştirildi ve bu gibi bir şeyden kurtulamayacaktı. Yine de teşekkürler. –

    2

    Bu geç bir nottur, ancak Google'ın geri dönüşüdür, bundan bahsetmek istedim. başka bir değere NULL değiştirme

    kötü bir fikir (tm).

    COUNT() DISTINCT değil, böyle yapıyor.

    Bunun yerine, alt sorgu DISTINCT kullanımı ve numarası verir ve dış sorguda bu toplar.

    bu basit bir örneğidir:

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

    Bu COUNT(*) (o kayıtları sayıldığı için değil değerler) boş değerlere göz ardı etmeyen, kullanılacak sağlar.