Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取到给定日期的用户数_Sql_Sql Server_Date_Group By - Fatal编程技术网

Sql 获取到给定日期的用户数

Sql 获取到给定日期的用户数,sql,sql-server,date,group-by,Sql,Sql Server,Date,Group By,我在连接中使用了以下两个表 表1:大鼠项目持续时间图 列:UID、小时值、月值 表2:用户 列:UID,状态,左开 此处状态将包含文本('Act'、'InAct') 现在,我试图获得按月值字段分组的UID计数,如下所示 select count(r.uid) as cnt, r.month_val from rat_proj_duration_map r inner join users u on r.uid = u.uid where r.year_val = 2018 grou

我在连接中使用了以下两个表

表1:大鼠项目持续时间图
列:UID、小时值、月值

表2:用户
列:UID,状态,左开

此处状态将包含文本('Act'、'InAct')

现在,我试图获得按月值字段分组的UID计数,如下所示

select count(r.uid) as cnt, r.month_val
from rat_proj_duration_map r
    inner join users u on r.uid = u.uid 
where  r.year_val = 2018 
group by r.month_val
order by month_val
Count  Month_val
100      1
100      2
100      3
99       4
99       5
99       6
99       7
99       8
99       9
99       10
99       11
99       12
上面的查询以月份为单位给出记录的计数

但是,我试图从左键的日期(用户表中的左键打开)开始忽略“未激活”用户(用户表中的状态字段)

因此,如果用户留在“2018-03-27”上,则该用户记录应统计到3月份,而不是之后

要添加到我的查询中的条件是什么

示例输出: 如果有100个用户记录,一个用户在“2018-03-27”上留下状态为“未激活”,那么我的结果应该如下所示

select count(r.uid) as cnt, r.month_val
from rat_proj_duration_map r
    inner join users u on r.uid = u.uid 
where  r.year_val = 2018 
group by r.month_val
order by month_val
Count  Month_val
100      1
100      2
100      3
99       4
99       5
99       6
99       7
99       8
99       9
99       10
99       11
99       12
你可以试试这个

select count(case when u.status='Act' then r.uid end) as cnt, r.month_val
from rat_proj_duration_map r
inner join users u on r.uid = u.uid 
where  r.year_val = 2018 
group by r.month_val
order by month_val
你可以试试这个

select count(case when u.status='Act' then r.uid end) as cnt, r.month_val
from rat_proj_duration_map r
inner join users u on r.uid = u.uid 
where  r.year_val = 2018 
group by r.month_val
order by month_val

根据用户的禁用日期按每个项目筛选用户。您可以使用附加的连接子句(或者在本例中的
WHERE
中)来完成此操作

DECLARE@FilterYear INT=2018
挑选
将(r.uid)计数为cnt,
r、 月日
从…起
鼠类项目持续时间图
r.uid=u.uid上的内部联接用户u
哪里
r、 年份值=@FilterYear和
(
u、 left_on为空或
年份(u.left_on)>@FilterYear或

(YEAR(u.left_on)=@FilterYear和R.month_val根据用户的禁用日期按每个项目筛选用户。您可以通过附加的加入子句(或在本例中的
来执行此操作)

DECLARE@FilterYear INT=2018
挑选
将(r.uid)计数为cnt,
r、 月日
从…起
鼠类项目持续时间图
r.uid=u.uid上的内部联接用户u
哪里
r、 年份值=@FilterYear和
(
u、 left_on为空或
年份(u.left_on)>@FilterYear或
(年(左上)=@FilterYear和R.month\u val我想你想要这个:

SELECT COUNT(CASE WHEN u.status = 'InAct' AND u.left_on < DATEADD(month, month_val - 1, DATEADD(year, year_val - 1900, 0)) THEN NULL ELSE 1 END) AS cnt, r.month_val
FROM rat_proj_duration_map r
INNER JOIN users u ON r.uid = u.uid
WHERE r.year_val = 2018
GROUP BY r.year_val, r.month_val
ORDER BY r.year_val, r.month_val
选择COUNT(当u.status='incat'和u.left_on
表达式
DATEADD(month,month\u val-1,DATEADD(year,year\u val-1900,0))
2018,3
转换为
2018-03-01
。用户状态为非活动且用户离开时间早于01年的记录不需要统计

我想你想要这个:

SELECT COUNT(CASE WHEN u.status = 'InAct' AND u.left_on < DATEADD(month, month_val - 1, DATEADD(year, year_val - 1900, 0)) THEN NULL ELSE 1 END) AS cnt, r.month_val
FROM rat_proj_duration_map r
INNER JOIN users u ON r.uid = u.uid
WHERE r.year_val = 2018
GROUP BY r.year_val, r.month_val
ORDER BY r.year_val, r.month_val
选择COUNT(当u.status='incat'和u.left_on
表达式
DATEADD(month,month\u val-1,DATEADD(year,year\u val-1900,0))
2018,3
转换为
2018-03-01
。用户状态为非活动且用户离开时间早于01年的记录不需要统计

您可以尝试此查询(代码中的必要注释):

另外,请记住,所有查询都不包含年份,因此您应该添加另一个分组变量。不幸的是,我自己无法尝试此操作,因为您没有给出示例数据。

您可以尝试此查询(代码中的必要注释):



另外,请记住,查询中没有一个包含年份,因此您应该添加另一个分组变量。不幸的是,我自己无法尝试此操作,因为您没有给出示例数据。

您的表
rat\u proj\u duration\u map
是某种日历表吗?我们无法运行您提供的查询,也无法访问您的对象。我只能告诉您根据我们所掌握的信息,您可以在
的WHERE
中再添加一个子句。可能是
和DATEPART(MONTH,u.dateleft)
rat\u proj\u duration\u map
将月份值包含为整数,我知道,否则您将无法使用
r.month\u val
。不过,您的评论没有告诉我有关该表的任何其他信息,我担心。当用户处于“非激活”状态时,左上角将由日期时间戳填充,因此我不得不忽略来自退出日期的月份值是您的表
rat\u proj\u duration\u map
某种日历表?我们无法运行您提供的查询,也无法访问您的对象。根据我们掌握的信息,我只能告诉您在
WHERE
中添加一个进一步的子句。可能
和DATEPART(month,u.dateleft)
rat\u proj\u duration\u map
将月份值包含为整数,我知道,否则您将无法使用
r.month\u val
。不过,您的评论没有告诉我有关该表的任何其他信息,我担心。当用户处于“非激活”状态时,左上角将由日期时间戳填充,因此我不得不忽略来自e退出日期的月份值不起作用。一旦用户未标记为
'Act'
,他们将从所有月份打折,而不仅仅是从后续月份打折。这不起作用。一旦用户未标记为
'Act'
,他们将从所有月份打折,而不仅仅是从后续月份打折。谢谢,但您的SQL始终只提供三个rows(1月,2月,3月)@ManiMuthuPandi编辑,添加了对空值左_的检查。请再次运行。非常感谢,您很出色;是的,我需要它是基于月而不是基于日期,因此如果用户在任何日期离开,都没有问题,但您的SQL始终只给出三行(1月,2月,3月)@ManiMuthuPandi编辑,添加了对空值左_的检查。请重新运行。非常感谢,您正在运行;是的,我需要它以月为基础而不是以日期为基础,因此如果用户在任何日期没有问题您的查询没有选择UID计数,我将think@ManiMuthu