求sql 计算全年每个月的会员总数

maggie_ma900 2009-02-25 11:05:02
数据表结构:会员号,起始日期 结束日期
1111 2008-12-1 2009-1-31
2222 2009-2-1 2010-2-21
3333 2009-3-1 2010-2-21
4444 2009-4-1 2009-4-31


求全年每个月的会员总数
例如如上计算结果 年份 会员总数
2009-1 4
2009-2 3

谢谢
...全文
514 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
JeffreyZhang1314 2009-02-27
  • 打赏
  • 举报
回复
过路的看看!
shanshuang0818 2009-02-27
  • 打赏
  • 举报
回复
支持 爱新觉罗.毓华
maggie_ma900 2009-02-27
  • 打赏
  • 举报
回复
不用临时表 怎么写?
FNO1468 2009-02-26
  • 打赏
  • 举报
回复 1


create table B(id2 varchar(10) ,starttime varchar(20),endtime varchar(20))

insert B select '1111','2008-01-01','2009-01-01' union all
select '2222','2008-01-21','2009-01-01' union all
select '3333','2008-02-01','2009-01-01' union all
select '4444','2008-02-20','2009-01-01' union all
select '5555','2008-02-13','2009-01-01'

select left(starttime,7) as '月份',count(distinct id2) as '人数'from B group by left(starttime,7)

月份 人数
2008-01 2
2008-02 3


drop table B
maggie_ma900 2009-02-25
  • 打赏
  • 举报
回复
楼上写的有点不明白#n 是什么表 ,dateadd(day , n.id , 起始日期)代表什么意思?
zzxap 2009-02-25
  • 打赏
  • 举报
回复
select convert(varchar(7),起始日期,120) 年份 , count(*) 会员总数 from tb group by convert(varchar(7),起始日期,120)


dawugui 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 maggie_ma900 的回复:]
哦 我写错了 应该是
2222 2009-1-1 2010-2-21
3333 2009-1-1 2010-2-21
4444 2009-1-1 2009-4-21
[/Quote]

create table tb(会员号 varchar(10),起始日期 datetime, 结束日期 datetime) 
insert into tb values('1111' , '2008-12-01' , '2009-01-31')
insert into tb values('2222' , '2009-01-01' , '2010-02-21')
insert into tb values('3333' , '2009-01-01' , '2010-02-21')
insert into tb values('4444' , '2009-01-01' , '2009-04-21')
go

--临时表
select top 8000 identity(int,0,1) as id into # from syscolumns a,syscolumns b
select convert(varchar(7),dt,120) 月份 , count(distinct 会员号) 会员总数 from
(
select distinct 会员号 , dateadd(day , n.id , 起始日期) dt from tb , # n where dateadd(day , n.id , 起始日期) <= 结束日期
) t
group by convert(varchar(7),dt,120)
/*
月份 会员总数
------- -----------
2008-12 1
2009-01 4
2009-02 3
2009-03 3
2009-04 3
2009-05 2
2009-06 2
2009-07 2
2009-08 2
2009-09 2
2009-10 2
2009-11 2
2009-12 2
2010-01 2
2010-02 2

(所影响的行数为 15 行)
*/

drop table tb , #
maggie_ma900 2009-02-25
  • 打赏
  • 举报
回复
哦 我写错了 应该是
2222 2009-1-1 2010-2-21
3333 2009-1-1 2010-2-21
4444 2009-1-1 2009-4-21

dawugui 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 maggie_ma900 的回复:]
是结束日期
例如:1111,2222,3333,4444 的结束日期在2009年1月都在会 所以 2009-1 会员总数是 4
2009年2月 应该有的会员总是为:2222,3333,4444 所以会员总数是3
[/Quote]
2222 2009-2-1 2010-2-21
3333 2009-3-1 2010-2-21
4444 2009-4-1 2009-4-31

你2222,3333,4444都是2月份后才开始的,1月份也算进去?牵强了吧?
另2009-4-31数据错误,4月没有31号.
maggie_ma900 2009-02-25
  • 打赏
  • 举报
回复
是结束日期
例如:1111,2222,3333,4444 的结束日期在2009年1月都在会 所以 2009-1 会员总数是 4
2009年2月 应该有的会员总是为:2222,3333,4444 所以会员总数是3
肥龙上天 2009-02-25
  • 打赏
  • 举报
回复

楼主要的是不是这个
if object_id('tb') is not null drop table tb
go
create table tb(会员号 varchar(10),起始日期 datetime, 结束日期 datetime)
insert into tb values('1111' , '2008-12-01' , '2009-01-31')
insert into tb values('2222' , '2009-02-01' , '2010-02-21')
insert into tb values('3333' , '2009-03-01' , '2010-02-21')
insert into tb values('4444' , '2009-04-01' , '2009-04-30')
go

select 起始日期,dateadd(mm,1,a.起始日期)-1 as 结束日期
,会员数目 = (select count(1) from tb where 起始日期 <= a.起始日期 and 结束日期 >= dateadd(mm,1,a.起始日期)-1)
from tb a
group by 起始日期

起始日期 结束日期 会员数目
----------------------- ----------------------- -----------
2008-12-01 00:00:00.000 2008-12-31 00:00:00.000 1
2009-02-01 00:00:00.000 2009-02-28 00:00:00.000 1
2009-03-01 00:00:00.000 2009-03-31 00:00:00.000 2
2009-04-01 00:00:00.000 2009-04-30 00:00:00.000 3

(4 row(s) affected)


dawugui 2009-02-25
  • 打赏
  • 举报
回复
create table tb(会员号 varchar(10),起始日期 datetime, 结束日期 datetime) 
insert into tb values('1111' , '2008-12-01' , '2009-01-31')
insert into tb values('2222' , '2009-02-01' , '2010-02-21')
insert into tb values('3333' , '2009-03-01' , '2010-02-21')
insert into tb values('4444' , '2009-04-01' , '2009-04-30')
go

--1
select convert(varchar(7),起始日期,120) 年份 , count(*) 会员总数 from tb group by convert(varchar(7),起始日期,120)
/*
年份 会员总数
------- -----------
2008-12 1
2009-02 1
2009-03 1
2009-04 1

(所影响的行数为 4 行)
*/

--2
select convert(varchar(7),结束日期,120) 年份 , count(*) 会员总数 from tb group by convert(varchar(7),结束日期,120)
/*
年份 会员总数
------- -----------
2009-01 1
2009-04 1
2010-02 2

(所影响的行数为 3 行)
*/

--3
--临时表
select top 8000 identity(int,0,1) as id into # from syscolumns a,syscolumns b
select convert(varchar(7),dt,120) 月份 , count(distinct 会员号) 会员总数 from
(
select distinct 会员号 , dateadd(day , n.id , 起始日期) dt from tb , # n where dateadd(day , n.id , 起始日期) <= 结束日期
) t
group by convert(varchar(7),dt,120)
/*
月份 会员总数
------- -----------
2008-12 1
2009-01 1
2009-02 1
2009-03 2
2009-04 3
2009-05 2
2009-06 2
2009-07 2
2009-08 2
2009-09 2
2009-10 2
2009-11 2
2009-12 2
2010-01 2
2010-02 2

(所影响的行数为 15 行)
*/

drop table tb , #
dawugui 2009-02-25
  • 打赏
  • 举报
回复
select convert(varchar(7),起始日期,120) 年份 , count(*) 会员总数 from tb group by convert(varchar(7),起始日期,120) 
select convert(varchar(7),结束日期,120) 年份 , count(*) 会员总数 from tb group by convert(varchar(7),结束日期,120)
dawugui 2009-02-25
  • 打赏
  • 举报
回复
按哪个日期算?

起始日期 结束日期
maggie_ma900 2009-02-25
  • 打赏
  • 举报
回复
我再把这个问题说一下吧:
表结构 :会员号 开始日期 结束日期
1111 2007-1-5 2009-1-20
2222 2008-5-1 2009-2-16
3333 2009-1-1 2009-5-4
求 2009 年所有月份的会员总数

结果要求 2009-1 3
2009-2 2






maggie_ma900 2009-02-25
  • 打赏
  • 举报
回复
8楼做个临时表 select top 8000 identity(int,0,1) as id into # from syscolumns a,syscolumns b
是为什么? 只用一个表就可以了
YUANHUILONG 2009-02-25
  • 打赏
  • 举报
回复
8樓對
第二天 1、查询客户表,统计每个机构2000年之前开户数、2000~2005开户数(含头不含尾)、2005~2010开户数(含头不含尾)、2010之后开户数 展示字段:机构号、2000年之前开户数、2000~2005年开户数、2005~2010年开户数、2010年之后开户数 2、查询客户表,按年份统计,每年、每个机构开户数占全年开户数的占比 展示字段:年份、机构号、开户数、开户占比百分比(百分比) 3、统计所有客户的客户号、存款账户数、2011.12.31日的存款余额、2011.12存款日均、贷款账户数、2011.12.31日的贷款余额、2011.12贷款日均 备注:null置为0 第三天 1、统计所有客户的2011.12.31日的存款余额、存款比上日余额、存款比上余额、、存款比上年余额 备注:存款比上日余额 = 2011.12.31日的存款余额-2011.12.30日的存款余额 存款比上余额 = 2011.12.31日的存款余额-2011.11.30日的存款余额 存款比上年余额 = 2011.12.31日的存款余额-2010.12.31日的存款余额 只有2011.12.31这个日期可以写死,其他日期要通过2011.12.31这个日期来生成。 2、统计所有2011年存款年日均大于100的客户号、客户名称、存款账户数、2011年年日均 第四天 1、统计所有2011年存款年日均和2011年贷款年日均都大于100的客户号、存款账户数、2011年存款年日均、贷款账户数、2011年贷款年日均 2、统计所有客户的客户号、 存款标志(有存款账户的客户置为1、没存款账户的客户置为0)、 贷款标志(有贷款借据的客户置为1、没贷款借据的客户置为0)、 存款质量分类(2011年存款年日均>=10000置为优质、2011年存款年日均>=1000<10000 置为良好、2011年存款年日均=10000置为优质、2011年贷款年日均>=1000<10000 置为良好、2011年贷款年日均<1000置为普通)、 2011年贷款年日均 第五天 1、根据《事件表.xlsx》来建表,然后将excel中的数据导入到目标表中 2、根据客户表、存款信息表、事件表,统计每个客户2017年的客户号、 交易账户数(客户下有多少个账户有交易就是多少)、 当年有交易的天数(如果2017年有5天有过交易,则有交易天数为5)、 当年有交易总数(如果2017的1、3、5有交易,则有交易总数为3)、 最大的交易总金额(按统计交易金额,存放最大的交易金额)、 最大交易金额的份(按统计交易金额,存放交易金额最大的份)、 年总交易金额、 年交易金额排名(按客户排名,如果总交易金额为0,则不参与排名,排名置为9999)、 年总手续费、 年总手续费排名(按客户排名,如果总手续费为0,则不参与排名,排名置为9999)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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