日期:2014-05-17  浏览次数:20611 次

------------------------求教一个SQL查询问题-------------------------------------
大概有以下的一个表格
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 查询

------解决方案--------------------
----------------------------
-- 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 行受影响)
*/

------解决方案--------------------
上面的有問題
select mlszh,a,b,a-b