表S有三个字段:
A    B     C
----------------
1    a     null
2    a     100
3    a     200
4    b     100
5    a     null
6    a     300要按C实现分组统计count数(只区分null和not null,即所有not null的要统计到一起)
结果为
B    count(c)
---------------
a        2   (null)
a        3   (不为null的数目,有100,200,300三个)
b        1谢谢。

解决方案 »

  1.   

    ----------------------------------------------------------------
    -- Author  :SQL77(只为思齐老)
    -- Date    :2010-03-29 09:03:18
    -- Version:
    --      Microsoft SQL Server  2000 - 8.00.2039 (Intel X86) 
    -- May  3 2005 23:18:38 
    -- Copyright (c) 1988-2003 Microsoft Corporation
    -- Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:#TB
    if object_id('tempdb.dbo.#TB') is not null drop table #TB
    go 
    create table #TB([A] int,[B] varchar(1),[C] int)
    insert #TB
    select 1,'a',null union all
    select 2,'a',100 union all
    select 3,'a',200 union all
    select 4,'b',100 union all
    select 5,'a',null union all
    select 6,'a',300
    --------------开始查询--------------------------select B,COUNT(1)NUM from #TB WHERE C IS NULL GROUP BY  B
    UNION ALLselect B,COUNT(C) NUM from #TB   GROUP BY  B
    ----------------结果----------------------------
    /* (所影响的行数为 6 行)B    NUM         
    ---- ----------- 
    a    2
    a    3
    b    1(所影响的行数为 3 行)警告: 聚合或其它 SET 操作消除了空值。*/
      

  2.   

    --> Title  : Generating test data 
    --> Author : wufeng4552
    --> Date   : 2010-03-29 09:03:15
     
    if not object_id('tb') is null
    drop table tb
    Go
    Create table tb([A] int,[B] nvarchar(1),[C] int)
    Insert tb
    select 1,N'a',null union all
    select 2,N'a',100 union all
    select 3,N'a',200 union all
    select 4,N'b',100 union all
    select 5,N'a',null union all
    select 6,N'a',300
    Go
    select b,
           ltrim(count(*))[count]
    from tb 
    where c is not null
    group by b 
    union all
    select b,
           ltrim(count(*))+'(null)'[count]
    from tb 
    where c is  null
    group by b 
    /*
    b    count
    ---- ------------------
    a    3
    b    1
    a    2(null)(3 個資料列受到影響)*/
      

  3.   

    --------------------------------------------------------------------------
    --  Author : htl258(Tony)
    --  Date   : 2010-03-29 09:03:03
    --  Version:Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) 
    --          Mar 29 2009 10:27:29 
    --          Copyright (c) 1988-2008 Microsoft Corporation
    --          Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
    --------------------------------------------------------------------------
    --> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb]([A] INT,[B] NVARCHAR(10),[C] INT)
    INSERT [tb]
    SELECT 1,'a',NULL UNION ALL
    SELECT 2,'a',100 UNION ALL
    SELECT 3,'a',200 UNION ALL
    SELECT 4,'b',100 UNION ALL
    SELECT 5,'a',NULL UNION ALL
    SELECT 6,'a',300
    GO
    --SELECT * FROM [tb]-->SQL查询如下:
    SELECT B,COUNT(CASE WHEN C IS NULL THEN 'A' ELSE 'B' END) [COUNT]
    FROM tb
    GROUP BY B,CASE WHEN C IS NULL THEN 'A' ELSE 'B' END
    /*
    B          COUNT
    ---------- -----------
    a          2
    a          3
    b          1(3 行受影响)
    */
      

  4.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2010-03-29 09:06:02
    -- Verstion:
    --      Microsoft SQL Server 2005 - 9.00.4053.00 (Intel X86) 
    -- May 26 2009 14:24:20 
    -- Copyright (c) 1988-2005 Microsoft Corporation
    -- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([A] int,[B] varchar(1),[C] int)
    insert [tb]
    select 1,'a',null union all
    select 2,'a',100 union all
    select 3,'a',200 union all
    select 4,'b',100 union all
    select 5,'a',null union all
    select 6,'a',300
    --------------开始查询--------------------------
    select b,count(1) as num from [tb]  where c is null group by b
    union all
    select b,count(1) as num from [tb]  where c is  not null group by b
    ----------------结果----------------------------
    /* b    num
    ---- -----------
    a    2
    a    3
    b    1(3 行受影响)
    */
      

  5.   


    if object_id('[TB]') is not null drop table [TB]
    create table [TB]([A] int,[B] varchar(1),[C] int)
    insert [TB]
    select 1,'a',null union all
    select 2,'a',100 union all
    select 3,'a',200 union all
    select 4,'b',100 union all
    select 5,'a',null union all
    select 6,'a',300select B,num=count(1) from [TB] 
    group by 0/C,B/*
    B    num
    ---- -----------
    a    2
    a    3
    b    1(3 行受影响)*/
    drop table TB
      

  6.   

    这个想法不错,但建议用乘法,因为C列可能有0--> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb]([A] INT,[B] NVARCHAR(10),[C] INT)
    INSERT [tb]
    SELECT 1,'a',NULL UNION ALL
    SELECT 2,'a',100 UNION ALL
    SELECT 3,'a',200 UNION ALL
    SELECT 4,'b',100 UNION ALL
    SELECT 5,'a',NULL UNION ALL
    SELECT 6,'a',300 UNION ALL
    SELECT 6,'a',0
    GO
    --SELECT * FROM [tb]-->SQL查询如下:
    SELECT B,COUNT(1) [COUNT]
    FROM tb
    GROUP BY B,C*0
    /*
    B          COUNT
    ---------- -----------
    a          2
    a          3
    b          1(3 行受影响)
    */
      

  7.   


    select b,count(*) from #tb group by b,case when c is null then 1 else 0 end order by b
      

  8.   

    declare @s table (id int,b nvarchar(10),c int)
    insert into @s select 1,'a',null
         union all select 2,'a',100
         union all select 3,'a',200
         union all select 4,'b',100
         union all select 5,'a',null
         union all select 6,'a',300
    select b,[count(c)]= count(*) from 
           (select *,px=dense_rank()over(order by case when c is null then 1 else 0 end) from @s) tb
                         group by b,px order by bb          count(c)
    ---------- -----------
    a          3
    a          2
    b          1(3 行受影响)