大概有以下的一个表格
tbname(mlszh varchar(20),yclsj int)
里面具体说有下面的一些数据
'1',23
'1',34
'1',NULL
'1',NULL
'1',0
'2',34
'2',NULL
'2',0
'2',56
'2',67
现在我要求的是:按照mlszh分组,求分组后的总行数、yclsj中为0或者NULL的行数,比如,上述的结果是:
mlszh 总记录数  为0或者NULL的行数  部不为0且不为NULL的行数
1       5            3                 2
2       5            2                 3
请问要怎么写?最好是用一个语句就搞定的,因为我的数据量有点大。谢谢各位了!!!sql查询

解决方案 »

  1.   

    补充一点,应该是,为零为NULL或者为空字符串的,后面的yclsj可以改为varchar类型如果有必要,谢谢大家了
      

  2.   

    ----------------------------------------------------------------
    -- Author  :DBA_Huangzj(發糞塗牆)
    -- Date    :2013-01-16 23:32:12
    -- Version:
    --      Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86) 
    -- Jun 17 2011 00:57:23 
    -- Copyright (c) Microsoft Corporation
    -- Enterprise Edition on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)
    --
    ----------------------------------------------------------------
    --> 测试数据:
    if object_id('tbname') is not null 
    drop table [tbname]
    go 
    create table [tbname](mlszh varchar(20),yclsj int)
    insert [tbname]
    SELECT 1,'23'union all
    select 1,'34' union all
    select 1,NULL union all
    select 1,NULL union all
    select 1,0 union all
    select 2,34 union all
    select 2,NULL union all
    select 2,0 union all
    select 2,56 union all
    select 2,67
    --------------开始查询--------------------------select mlszh,COUNT(mlszh) [总记录数],SUM(CASE WHEN yclsj=0 OR yclsj IS NULL THEN 1 ELSE 0 END) AS [为0或者NULL的行数]  
     ,COUNT(mlszh)-SUM(CASE WHEN yclsj=0 OR yclsj IS NULL THEN 1 ELSE 0 END) AS [部不为0且不为NULL的行数] 
    from [tbname]
    GROUP BY mlszh
    ----------------结果----------------------------
    /* 
    mlszh                总记录数        为0或者NULL的行数 部不为0且不为NULL的行数
    -------------------- ----------- ----------- --------------
    1                    5           3           2
    2                    5           2           3(2 行受影响)
    */
      

  3.   

    select mlszh,[总记录数],[为0或者NULL或者''的行数]  ,[总记录数]-[为0或者NULL或者''的行数]
    from
    ( select mlszh,COUNT(mlszh) [总记录数],
    SUM(CASE WHEN yclsj=0 OR yclsj IS NULL OR yclsj='' THEN 1 ELSE 0 END) AS [为0或者NULL的行数]  
    from [tbname]
    GROUP BY mlszh ) as a
      

  4.   

    上面的有問題
    select mlszh,a,b,a-b
    from
    ( select mlszh,COUNT(mlszh) a,
    SUM(CASE WHEN yclsj=0 OR yclsj IS NULL OR yclsj='' THEN 1 ELSE 0 END) AS b,
    from [tbname]
    GROUP BY mlszh ) as a