各位大侠,求一条巨难的sql

gssmxm 2008-03-06 10:56:31
有一张表,有地区、用户名、注册时间。给定一个起始时间、一个终止时间,求给定起止时间内的期间记录数,以及到终止时间的记录数。用一条sql实现。比如说给定时间2008-1-10和2008-3-9,首个注册用户的注册时间为2007-8-19.既求2008-1-10和2008-3-9间的记录数以及2007-8-19和2008-3-9的记录数。谢谢!
...全文
225 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
补课 2008-03-07
  • 打赏
  • 举报
回复
23楼的写的可以实现了,如果不想分地区的话,直接这样写就可以了.
DECLARE @Start datetime, @End datetime
SELECT @Start = '2008-01-01', @End='2008-03-09'

SELECT

期间人数=sum(case when 注册时间>=@Start and 注册时间<=@End THEN 1 else 0 end),
总人数=sum(case when 注册时间<=@End then 1 else 0 end)
from
[Party]
[Quote=引用 23 楼 Limpire 的回复:]
SQL code-->测试数据: party
create table party (用户名 varchar(2),地区 varchar(4),注册时间 datetime)
insert into party
select 'aa','山东','2007-03-05' union all
select 'bb','广东','2008-02-11' union all
select 'cc','山东','2008-03-05'

/*
用户从界面上选择时间 起始日期 结束日期
如用户选择 起始日期为2008-01-01 结束日期为2008-03-05
查询要出的结果:
地区 期间人数 总人数(注:这…
[/Quote]
flairsky 2008-03-07
  • 打赏
  • 举报
回复
between 很容易搞定

巨难…… - -!!!
昵称被占用了 2008-03-07
  • 打赏
  • 举报
回复
declare @dt1 as datetime
declare @dt2 as datetime
set @dt1 = '2008-1-10'
set @dt2 = '2008-3-9'


select sum(case when 注册时间>=@dt1 then 1 else 0 end) as 期间记录数,
count(1) as 到终止时间的记录数
from tb where 注册时间<=@dt2



ps:不要乱用巨难,这题最难的是理解楼主的表达
lhsxsh 2008-03-07
  • 打赏
  • 举报
回复
select count(distinct(用户名)) as '记录数' from tb
where dt between '开始时间' and '结束时间'
group by 用户名

  • 打赏
  • 举报
回复
送你一句话,你出的题目很垃圾!可能是我笨,不过我发现你的起始日期就是有什么用呢?
Limpire 2008-03-07
  • 打赏
  • 举报
回复
-->测试数据: party
create table party (用户名 varchar(2),地区 varchar(4),注册时间 datetime)
insert into party
select 'aa','山东','2007-03-05' union all
select 'bb','广东','2008-02-11' union all
select 'cc','山东','2008-03-05'

/*
用户从界面上选择时间 起始日期 结束日期
如用户选择 起始日期为2008-01-01 结束日期为2008-03-05
查询要出的结果:
地区 期间人数 总人数(注:这个人数是根据结束日期得到)
山东 1 2
广东 1 1
*/

declare @Start datetime, @End datetime
select @Start = '2008-01-01', @End = '2008-03-05'

select
地区,
期间人数=sum(case when 注册时间>=@Start and 注册时间<=@End then 1 else 0 end),
总人数=sum(case when 注册时间<=@End then 1 else 0 end)
from
party
group by
地区

/*
地区 期间人数 总人数
---- ----------- -----------
广东 1 1
山东 1 2
*/


-->删除测试
drop table party
jacksu19 2008-03-07
  • 打赏
  • 举报
回复
呵呵,把问题描述清楚了很重要...
否则,别人的答案往往不是你需要的
kelph 2008-03-07
  • 打赏
  • 举报
回复
select 地区, [期间人数]=sum(case  when 注册时间>=@起始日期  then 1 else 0 end),
[总人数]=sum(1) from 表 where 注册时间<=@结束日期 group by 地区
gssmxm 2008-03-07
  • 打赏
  • 举报
回复
表 party

用户名 地区 注册时间
aa 山东 2007-03-05
bb 广东 2008-02-11
cc 山东 2008-03-05

用户从界面上选择时间 起始日期 结束日期
如用户选择 起始日期为2008-01-01 结束日期为2008-03-05
查询要出的结果:
地区 期间人数 总人数(注:这个人数是根据结束日期得到)
山东 1 2
广东 1 1

不知道我说明白了么?各位大侠请赐教,此sql怎么写?
JiangHongTao 2008-03-06
  • 打赏
  • 举报
回复
select '期间记录数:'+rtrim(count(*)) from t where 注册时间 between  开始日期 and  结束日期
union
select '总记录数:'+rtrim(count(*)) from t
-狙击手- 2008-03-06
  • 打赏
  • 举报
回复
我更不好这个呀,SS吧
dawugui 2008-03-06
  • 打赏
  • 举报
回复
我不好这口,我让给你.
-狙击手- 2008-03-06
  • 打赏
  • 举报
回复
找小陈呀,现在出名得很
dawugui 2008-03-06
  • 打赏
  • 举报
回复
MM不在,我找鬼去约会啊?
-狙击手- 2008-03-06
  • 打赏
  • 举报
回复
你不会也去约会呀
dawugui 2008-03-06
  • 打赏
  • 举报
回复
MD,MM去约会了,我只好待这里了.
-狙击手- 2008-03-06
  • 打赏
  • 举报
回复
不允许笑,严肃点,这么晚不睡觉
dawugui 2008-03-06
  • 打赏
  • 举报
回复
呵呵
kelph 2008-03-06
  • 打赏
  • 举报
回复
select sum(case  when 注册时间>=@开始时间  then 1 else 0 end),
sum(1) from 表 where 注册时间<=@终止时间


-狙击手- 2008-03-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fcuandy 的回复:]
现在流行让猜.

比如刚才那个题为"如何找出两个不级格的"
[/Quote]
加载更多回复(8)

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧