日期:2014-05-18 浏览次数:20669 次
--> 测试数据:[T1] if object_id('[T1]') is not null drop table [T1] create table [T1]([地区] int,[个人编号] int,[姓名] varchar(1)) insert [T1] select 1001,1,'A' union all select 1001,2,'B' union all select 1002,3,'C' union all select 1002,4,'D' union all select 1003,5,'E' --> 测试数据:[T2] if object_id('[T2]') is not null drop table [T2] create table [T2]([个人编号] int,[建档日期] datetime) insert [T2] select 1,'2011-01-03' union all select 2,'2011-01-04' union all select 3,'2011-01-05' union all select 4,'2011-01-06' union all select 5,'2011-01-07' with t as( select a.地区,a.个人编号,b.建档日期 from [T1] a full join [T2] b on a.个人编号=b.个人编号 ) select 地区,COUNT(1) as 总人数, (select COUNT(1) from t b where a.地区=b.地区 and b.建档日期 between '2011-01-01' and '2011-01-05') as 时间范围内建档人数 from t a group by 地区 /* 地区 总人数 时间范围内建档人数 1001 2 2 1002 2 1 1003 1 0 */
------解决方案--------------------
IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'tba') BEGIN DROP TABLE tba END GO create table tba([地区] int,[个人编号] int,[姓名] varchar(1)) insert tba select 1001,1,'A' union all select 1001,2,'B' union all select 1002,3,'C' union all select 1002,4,'D' union all select 1003,5,'E' IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'tbb') BEGIN DROP TABLE tbb END GO create table tbb([个人编号] int,[建档日期] datetime) insert tbb select 1,'2011-01-03' union all select 2,'2011-01-04' union all select 3,'2011-01-05' union all select 4,'2011-01-06' union all select 5,'2011-01-07' SELECT A.[地区],COUNT(A.[个人编号]) AS 总人数,CASE WHEN 查询时间范围内建档数 IS NULL THEN 0 ELSE 查询时间范围内建档数 END AS 查询时间范围内建档数 FROM tba AS A INNER JOIN tbb AS B ON A.个人编号 = B.个人编号 LEFT OUTER JOIN ((SELECT [地区],COUNT([建档日期]) AS 查询时间范围内建档数 FROM tbb,tba WHERE tba.个人编号 = tbb.个人编号 AND [建档日期] BETWEEN '2011-01-01' AND '2011-01-05' GROUP BY [地区])) AS C ON A.地区 = C.地区 GROUP BY A.[地区],查询时间范围内建档数 ORDER BY A.[地区] 地区 总人数 查询时间范围内建档数 1001 2 2 1002 2 1 1003 1 0