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

求sql语句,统计
人员表,除了id,name,sex,班组, 还有个登记时间的字段类型是datetime
现在要求传入两个月份作为参数,查询出来所有班组分别对应两个月份的登记人数,并且显示第二个月份和第一个月份的差值,按照差值排序

------解决方案--------------------
select *
from (
select 班组, sum(case when convert(varchar(7),登记时间,120)='月份参数1' then 1 else 0 end) as [月份1人数],sum(case when convert(varchar(7),登记时间,120)='月份参数2' then 1 else 0 end) as [月份2人数]
from tb
where convert(varchar(7),登记时间,120)='月份参数1' or convert(varchar(7),登记时间,120)='月份参数2'
group by 班组)t
order by 月份1人数-月份2人数
------解决方案--------------------
--id,name,sex,班组, 登记时间
DECLARE @month1 CHAR(7), @month2 CHAR(7)
SELECT @month1 = '2013-03', @month2 = '2013-04'

SELECT 
班组 = COALESCE(a.班组, b.班组),
[数量1] = ISNULL(a.cnt, 0),
[数量2] = ISNULL(b.cnt, 0),
差值 = ISNULL(a.cnt, 0) - ISNULL(b.cnt, 0)
FROM
(
SELECT 班组, cnt=COUNT(1)
FROM TB
WHERE CONVERT(CHAR(7),登记时间,120) = @month1
GROUP BY 班组
) a
FULL JOIN
(
SELECT 班组, cnt=COUNT(1)
FROM TB
WHERE CONVERT(CHAR(7),登记时间,120) = @month2
GROUP BY 班组
) b
ON a.班组 = b.班组