统计报表,百分求SQL语句

denghan 2004-08-17 12:04:59
昨天问过了,现在又有新要求了。
数据库MSSQL2000
明细表
----------------------------------------
userID 用户ID c(15)
classID 栏目代码 c(3)
startDT 定阅时间
cancelDT 取消时间
status 状态 (0欠费 1 正常)

类别表
---------------------------------------
classID 类别编号
className 类别名称

要求的报表是以下格式
******************************
栏目 定制人数 欠费用户 开始时间 结束时间
------------------------------------------
栏目一 3009 100 2004-08-01 2004-08-17
栏目二 3401 123 2004-08-01 2004-08-17

....
1.要求可按输入的超始时间段来统计各类别的人数
2.要求统计某个时点比上一个特定时点增加的定阅用户数
(晕啊,SQL语句想得头晕啊)
请大侠们帮忙想个比较高效的SQL语句。百分感谢!
...全文
173 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangzs8896 2004-08-17
  • 打赏
  • 举报
回复
忘了点,看看下面的。其实还是没太理解,楼主对照我的数据,和结果,看是不是你需要的。
--测试如下
--[给定日期@dt,查询的是到这个时间为止,欠费的人数,最后欠费的日期。]
--明细表
create table mx(userID varchar(15),classID varchar(3),startDT datetime,cancelDT datetime,status int)
insert mx values('98004214','001','2003-07-14','2004-08-10',1)
insert mx values('98004215','001','2003-08-14','2004-01-10',0)
insert mx values('98004216','002','2003-08-14','2004-02-10',0)
insert mx values('98004217','001','2003-04-14','2004-03-10',0)
insert mx values('98004218','002','2003-05-14','2004-04-10',1)

--类别表
create table lb(classID varchar(3),className varchar(10))
insert lb values('001','栏目一')
insert lb values('002','栏目二')

declare @dt datetime
set @dt='2004-02-17'
select distinct 栏目=lb.className,a.定制人数,b.欠费用户,开始时间=convert(varchar(10),b.startDT,120),结束时间=convert(varchar(10),b.cancelDT,120)
from
(select classID, 定制人数=count(*)
from mx a
group by classID)a
left join
(select classID, 欠费用户=count(*),startDT=min(startDT),cancelDT=max(cancelDT)
from mx
where status=0 and datediff(day,cancelDT,@dt)>=0
group by classID
)b on a.classID=b.classID
left join lb on lb.classID=a.classID

order by 栏目 desc

drop table mx,lb


--结果

栏目 定制人数 欠费用户 开始时间 结束时间
---------- ----------- ----------- ---------- ----------
栏目一 3 1 2003-08-14 2004-01-10
栏目二 2 1 2003-08-14 2004-02-10
zhangzs8896 2004-08-17
  • 打赏
  • 举报
回复
--测试如下

--明细表
create table mx(userID varchar(15),classID varchar(3),startDT datetime,cancelDT datetime,status int)
insert mx values('98004214','001','2003-07-14','2004-08-10',1)
insert mx values('98004215','001','2003-08-14','2004-01-10',0)
insert mx values('98004216','002','2003-08-14','2004-02-10',0)
insert mx values('98004217','001','2003-04-14','2004-03-10',0)
insert mx values('98004218','002','2003-05-14','2004-04-10',1)

--类别表
create table lb(classID varchar(3),className varchar(10))
insert lb values('001','栏目一')
insert lb values('002','栏目二')

declare @dt datetime
set @dt='2004-02-17'
select a.*,b.欠费用户,开始时间=convert(varchar(10),startDT,120),结束时间=convert(varchar(10),b.cancelDT,120)
from
(select classID, 定制人数=count(*)
from mx a
group by classID)a
left join
(select classID, 欠费用户=count(*),startDT=min(startDT),cancelDT=max(cancelDT)
from mx
where status=0 and datediff(day,cancelDT,@dt)>=0
group by classID
)b on a.classID=b.classID


drop table mx,lb

--结果
classID 定制人数 欠费用户 开始时间 结束时间
------- ----------- ----------- ---------- ----------
001 3 1 2003-08-14 2004-01-10
002 2 1 2003-08-14 2004-02-10
denghan 2004-08-17
  • 打赏
  • 举报
回复
回楼上的 zhangzs8896(小二)
开始时间和结束时间是指在操作界面可由用户自行输入起至时间。

定制人数 = 欠费用户数 + 正常用户数

明细表中有一个字段cancelDT用来记录该用户发生欠费的时间

起至时间的意图是:统计一段时间内,各栏目各有多少定阅用户数和欠费用户数
和今天比昨天多了多少定阅用户数这样的功能

不知这个想法能否实现?谢谢
zhangzs8896 2004-08-17
  • 打赏
  • 举报
回复
不知道楼住的
栏目 定制人数 欠费用户 开始时间 结束时间
------------------------------------------
栏目一 3009 100 2004-08-01 2004-08-17
栏目二 3401 123 2004-08-01 2004-08-17

中的开始时间,结束时间是什么意思?

定制人数
欠费用户 是说这个栏目的总人数和欠费的人数吗?
那么开始时间与结束时间是怎么想的?
1老玉米1 2004-08-17
  • 打赏
  • 举报
回复
datFrom="2004-08-01"
datTo="2004-08-17"
strsql="select b.classname,count(a.userid) as countNumb,(count(a.userid)-sum(a.status))as noFeeUser,'"& datFrom &"' as strFrom,'"& datTo &"' as strTo from detail a,class b where a.classid=b.classid and a.startDT>='"& datFrom &"' and a.cancelDT<='"& datTo &"' group by a.userid"
1老玉米1 2004-08-17
  • 打赏
  • 举报
回复
datFrom="2004-08-01"
datTo="2004-08-17"
strsql="select b.classname,count(a.userid) as countNumb,(count(a.userid)-sum(a.status))as noFeeUser,"& datFrom &" as strFrom,"& datTo &" as strTo from detail a,class b where a.classid=b.classid and a.startDT>='"& datFrom &"' and a.cancelDT<='"& datTo &"' group by a.userid"

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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