一个月统计查询存储过程

zjroland 2017-10-23 03:53:07
我有一个城市用户表Accounts_Users
UserID CityID AddedDate
1 1 2017-01-04 00:25:45.730
2 1 2017-01-11 18:59:49.373
3 1 2017-02-05 10:44:14.263
4 1 2017-02-06 17:10:28.740
5 1 2017-02-07 18:43:20.417
6 1 2017-02-08 15:34:30.533
7 1 2017-02-11 22:48:40.537
8 1 2017-02-27 17:54:24.137
9 1 2017-03-20 10:24:20.117
10 1 2017-03-20 15:01:21.547
11 1 2017-03-23 00:30:58.057
12 1 2017-03-30 21:45:49.563
13 1 2017-04-04 13:22:13.737
14 2 2017-04-09 11:48:24.913
15 1 2017-04-11 18:27:37.720
16 1 2017-04-12 18:14:17.097
17 1 2017-04-13 15:43:53.417
18 1 2017-04-24 12:32:51.613
19 1 2017-05-04 13:15:07.793
20 1 2017-05-07 14:08:14.263
21 1 2017-05-12 14:36:51.260
22 1 2017-05-15 23:33:00.747
23 1 2017-05-16 11:16:07.320
24 1 2017-05-18 13:47:06.903
25 1 2017-06-14 23:39:59.900
26 1 2017-06-15 22:56:29.100
还有一个城主表 Categories_Owners
OwnerID UserID CityID AddedDate
1 30 1 2017-03-05 10:44:14.263
我想查询城主(与用户的CityID相等)上任以来,城市人口的每月增长数量,结果应该是
(因为城主是3月上任的,只要统计3月到现在,也就是10月份人口的月数量)
月份 增加的人口
3 4
4 5
5 6
6 2
请问该如何写SELECT查询?
我写的存储过程不管用:

alter PROCEDURE [dbo].[GetOwnerChartByUserID]
@UserID int (这是城主的UserID)
AS

DECLARE @CityID int,@AddedDate DateTime
SELECT @CityID = CityID,@AddedDate=AddedDate FROM Categories_Owners WHERE UserID=@UserID

SELECT month(Accounts_Users.AddedDate) ownermonth,sum(Accounts_Users.UserID) ownerpeople
FROM Accounts_Users
WHERE Accounts_Users.AddedDate>=@AddedDate AND Accounts_Users.CityID = @CityID
GROUP BY month(Accounts_Users.AddedDate)
...全文
686 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjroland 2017-10-24
  • 打赏
  • 举报
回复
多谢各位,解决了。。。。
听雨停了 2017-10-24
  • 打赏
  • 举报
回复
引用 7 楼 zjroland 的回复:
统计数据的时间条件,怎么才能设为:统计时间> Categories_Owners.AddedDate AND 统计时间<getdate() 呢?
按上面这样改下存储过程就可以了,你试试看
听雨停了 2017-10-24
  • 打赏
  • 举报
回复

alter PROCEDURE [dbo].[GetOwnerChartByUserID]
@UserID int --(这是城主的UserID)
AS

DECLARE @CityID int,@AddedDate DateTime
SELECT @CityID = CityID,@AddedDate=AddedDate FROM #Categories_Owners WHERE UserID=@UserID

SELECT DISTINCT number,ISNULL(count(b.UserID) over(PARTITION BY month(b.AddedDate)),0) AS ownerpeople 
FROM MASTER..spt_values a
LEFT JOIN  #Accounts_Users b ON a.number=month(b.AddedDate) AND b.CityID = @CityID
WHERE TYPE='P' 
AND number BETWEEN month(@AddedDate) AND MONTH(GETDATE())


number      ownerpeople
----------- -----------
3           4
4           5
5           6
6           2
7           0
8           0
9           0
10          0
zjroland 2017-10-24
  • 打赏
  • 举报
回复
统计数据的时间条件,怎么才能设为:统计时间> Categories_Owners.AddedDate AND 统计时间<getdate() 呢?
zjroland 2017-10-24
  • 打赏
  • 举报
回复
我是想统计城主上任以来的所有的数据,那就是 3月到现在,10月份的数据。如果某个月没有,就自动填写数据为 0
二月十六 版主 2017-10-23
  • 打赏
  • 举报
回复
引用 4 楼 zjroland 的回复:
如果为0 的7-10几个月的数据也也统计,该如何办呢: 月份 增加的人口 3 4 4 5 5 6 6 2 7 0 8 0 9 0 10 0
Accounts_Users这个表中没有7-10这几个月的数据,是要固定添加这4个月的数据吗? 还是给的测试数据中给少了,如果是给少了,直接把语句放到实绩表中执行语句就行了
zjroland 2017-10-23
  • 打赏
  • 举报
回复
如果为0 的7-10几个月的数据也也统计,该如何办呢: 月份 增加的人口 3 4 4 5 5 6 6 2 7 0 8 0 9 0 10 0
zjroland 2017-10-23
  • 打赏
  • 举报
回复
我先测试一下啊,多谢版主。。。。
二月十六 版主 2017-10-23
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#Accounts_Users') is null
drop table #Accounts_Users
Go
CREATE TABLE #Accounts_Users(UserId INT,CityID INT,AddedDate DATETIME)
Insert #Accounts_Users
select 1,1,'2017-01-04 00:25:45.730' union all
select 2,1,'2017-01-11 18:59:49.373' union all
select 3,1,'2017-02-05 10:44:14.263' union all
select 4,1,'2017-02-06 17:10:28.740' union all
select 5,1,'2017-02-07 18:43:20.417' union all
select 6,1,'2017-02-08 15:34:30.533' union all
select 7,1,'2017-02-11 22:48:40.537' union all
select 8,1,'2017-02-27 17:54:24.137' union all
select 9,1,'2017-03-20 10:24:20.117' union all
select 10,1,'2017-03-20 15:01:21.547' union all
select 11,1,'2017-03-23 00:30:58.057' union all
select 12,1,'2017-03-30 21:45:49.563' union all
select 13,1,'2017-04-04 13:22:13.737' union all
select 14,2,'2017-04-09 11:48:24.913' union all
select 15,1,'2017-04-11 18:27:37.720' union all
select 16,1,'2017-04-12 18:14:17.097' union all
select 17,1,'2017-04-13 15:43:53.417' union all
select 18,1,'2017-04-24 12:32:51.613' union all
select 19,1,'2017-05-04 13:15:07.793' union all
select 20,1,'2017-05-07 14:08:14.263' union all
select 21,1,'2017-05-12 14:36:51.260' union all
select 22,1,'2017-05-15 23:33:00.747' union all
select 23,1,'2017-05-16 11:16:07.320' union all
select 24,1,'2017-05-18 13:47:06.903' union all
select 25,1,'2017-06-14 23:39:59.900' union all
select 26,1,'2017-06-15 22:56:29.100'
Go
if not object_id(N'Tempdb..#Categories_Owners') is null
drop table #Categories_Owners
Go
CREATE TABLE #Categories_Owners(OwnerID INT, UserID INT,CityID INT, AddedDate DATETIME)
Insert #Categories_Owners
select 1,30,1,'2017-03-05 10:44:14.263'
Go
--测试数据结束
SELECT MONTH(#Accounts_Users.AddedDate) AS 月份 ,
COUNT(1) AS 增加的人口
FROM #Categories_Owners
JOIN #Accounts_Users ON #Accounts_Users.CityID = #Categories_Owners.CityID
AND #Accounts_Users.AddedDate >= #Categories_Owners.AddedDate
GROUP BY MONTH(#Accounts_Users.AddedDate)


zjroland 2017-10-23
  • 打赏
  • 举报
回复
差点忘了,如果月统计是0也要显示: 月份 增加的人口 3 4 4 5 5 6 6 2 7 0 8 0 9 0 10 0

34,590

社区成员

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

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