日期:2014-05-19  浏览次数:20686 次

新手提问:如何在一张表中按不同条件进行不含重复行数的统计?
如何写下面情况下的sql语句
表a
编号         名称       标志         日期
0001           李           0           2007-01-01
0002           李           0           2007-01-10
0001           李           0           2007-01-11
0001           刘           0           2007-01-16
0008           李           0           2007-01-08
0003           王           1           2007-01-06
0003           王           0           2007-01-10
0003           王           1           2007-01-10
0004           刘           1           2007-01-10
0005           李           1           2007-01-09
0005           李           1           2007-01-10
要求按名称统计出:当时间为2007-01-01至2007-01-15标志等于0时编号不含重复行数和按名称当时间为2007-01-06至2007-01-10标志等于1时编号不含重复行数,即得出如下结果:
名称         标志(为0)       标志(为1)
李                 3                       1
王                 1                       1
刘                 0                       1
“猪”各位前辈,   猪年快乐!

------解决方案--------------------
select 编号,名称,sum(case when 日期 between '2007-01-01 ' and '2007-01-15 ' and 标志=0 then 1 else 0 end) '标志(为0) ' ,sum(case when 日期 between '2007-01-06 ' and '2007-01-10 ' and 标志=1 then 1 else 0 end ) '标志(为1) '
from tb
group by 编号,名称
------解决方案--------------------
declare @a table(编号 varchar(10), 名称 varchar(10), 标志 varchar(10), 日期 smalldatetime)
insert @a select '0001 ', '李 ', '0 ', '2007-01-01 '
union all select '0002 ', '李 ', '0 ', '2007-01-10 '
union all select '0001 ', '李 ', '0 ', '2007-01-11 '
union all select '0001 ', '刘 ', '0 ', '2007-01-16 '
union all select '0008 ', '李 ', '0 ', '2007-01-08 '
union all select '0003 ', '王 ', '1 ', '2007-01-06 '
union all select '0003 ', '王 ', '0 ', '2007-01-10 '
union all select '0003 ', '王 ', '1 ', '2007-01-10 '
union all select '0004 ', '刘 ', '1 ', '2007-01-10 '
union all select '0005 ', '李 ', '1 ', '2007-01-09 '
union all select '0005 ', '李 ', '1 &#