获取到指定日期之前的用户数

时间:2018-03-27 09:22:38

标签: sql sql-server date group-by

我在联接中使用了两个表

TABLE1: rat_proj_duration_map
列: UID,Hour_val,month_val

TABLE2:用户
列: UID,status,left_on

此处状态将包含文字(' Act',' InAct')

现在,我正在尝试计算按month_val字段分组的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

以上查询以月为单位显示记录的计数。

但是,我试图忽略“未激活的”#39;用户(用户表中的状态字段)来自左侧的日期(来自users表的left_on)。

因此,如果用户留在' 2018-03-27',则该用户记录应计入3月份,而不是在此之后。

要添加到我的查询中的条件

示例输出: 如果有100个用户记录和一个用户left_on' 2018-03-27'状态'已停用'那么我的结果应该如下所示

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

4 个答案:

答案 0 :(得分:2)

根据每个项目的禁用日期过滤用户。您可以使用其他连接子句(或在本例中为WHERE)执行此操作。

DECLARE @FilterYear INT = 2018

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 = @FilterYear AND
    (
        u.left_on IS NULL OR
        YEAR(u.left_on) > @FilterYear OR
        (YEAR(u.left_on) = @FilterYear AND R.month_val <= MONTH(u.left_on))
    )
group by 
    r.month_val
order by 
    month_val

请记住,我们正在比较年份和月份(没有天数)。您将不得不考虑在月中停用用户时会发生什么。

答案 1 :(得分:1)

我想你想要这个:

DATEADD(month, month_val - 1, DATEADD(year, year_val - 1900, 0))

表达式2018, 3会将2018-03-01转换为<ItemsControl ItemsSource="{Binding ConnectorItemsY}"> <ItemsControl.LayoutTransform> <RotateTransform Angle="270"/> </ItemsControl.LayoutTransform> <ItemsControl.Items> <Style TargetType="ComboBoxItem"> <Setter Property="LayoutTransform"> <Setter.Value> <RotateTransform Angle="0" /> </Setter.Value> </Setter> </Style> </ItemsControl.Items> </ItemsControl> 。您不需要计算用户状态为非活动且用户早于年 - 月01的记录。

SQL Fiddle with dummy data

答案 2 :(得分:1)

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

select [count] - [left_count] from 
(
    select [left_month_val],
           --this will give amount of users left UP TO particular month
           SUM([left_count]) over (order by [left_month_val] rows between unbounded preceding and current row) [left_count]
    from (
        --here you count how many users left in particular months
        select DATEPART(month, [left_on]) [left_month_val], COUNT(*) [left_count]
        from [users]
        group by DATEPART(month, [left_on])
    ) [a]
) [u] join (
    --here you count how many users were there in particular months
    select [month_val], count(*) [count]
    from rat_proj_duration_map
    group by [month_val]
) [r] on [u].[left_month_val] = [r].[month_val]

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

答案 3 :(得分:-1)

你可以试试这个

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