首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

新手提问:怎么在一张表中按不同条件进行不含重复行数的统计

2011-12-31 
新手提问:如何在一张表中按不同条件进行不含重复行数的统计?如何写下面情况下的sql语句表a编号名称标志日

新手提问:如何在一张表中按不同条件进行不含重复行数的统计?
如何写下面情况下的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 ', '2007-01-10 '



select b.名称,isnull(标志0,0) 标志0,标志1=(select count(distinct 编号 ) from @a where 日期 between '2007-01-06 ' and '2007-01-10 ' and 标志= '1 ' and 名称=b.名称)
from
(select a.名称,标志0=count(distinct 编号) from @a a where 日期 between '2007-01-01 ' and '2007-01-15 ' and 标志= '0 ' group by a.名称) c
right join
(select distinct 名称 from @a ) b
On c.名称=b.名称

[解决办法]
--有人在前面建表~真好
drop table #temp
create table #temp
(编号 int,
名称 varchar(10),
标志 int,
日期 datetime
)
insert into #temp
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 ', '2007-01-10 '

select 名称,
(select count(distinct 编号) from #temp
where 日期 BETWEEN '2007-01-01 ' and '2007-01-15 ' and 标志=0 and 名称=a.名称)[标志(为0)],
1 [标志(为1)]
from #temp a where 日期 BETWEEN '2007-01-06 ' and '2007-01-10 ' and 标志=1 group by 名称
[解决办法]
这里面武术写得代码不好
case a.名称 when a.名称 then (select count(distinct 编号) from #temp where 标志=0 and 日期 between '2007-01-01 ' and '2007-01-15 ' and 名称=a.名称) end [标志-0],
case 没起到作用
他的意思就是如果a.名称=a.名称 那么执行第一个 select语句 因为本来就相等所以执行
得出标志=0得数量
然后继续执行第二个case
case 字段 when 字段所需要得表达式 then 如果成立就执行
[解决办法]
select 部门, '标志(为0) '=sum([标志(为0)]), '标志(为1) '=sum([标志(为1)]) from (select 名称,
'标志(为0) '=(select count(distinct 编号) from 表A where 日期 between '2007-01-01 ' and '2007-01-15 ' and 名称=t.名称 and 标志=0),
'标志(为1) '=(select count(distinct 编号) from 表A where 日期 between '2007-01-01 ' and '2007-01-15 ' and 名称=t.名称 and 标志=1)
from (select distinct 名称 from 表A) as t) a join 表B b on a.名称=b.名称 group by 部门 order by 部门 desc

热点排行