Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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 - Fatal编程技术网

Sql 如何根据案例分组

Sql 如何根据案例分组,sql,sql-server,Sql,Sql Server,我有一个脚本,它可以整理两个日期之间的登录日志,并将它们分类为三个时间段之一。我需要它将它们组合在一起,统计在这些时间段内登录到系统的唯一用户的数量。例如: SQL: 选择 案例 在castdatediffsecond、'01-01-1970 00:00:00'、'2018-07-23 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2018-12-09 23:59:59'作为varchar之间创建lsl.TIME时,20

我有一个脚本,它可以整理两个日期之间的登录日志,并将它们分类为三个时间段之一。我需要它将它们组合在一起,统计在这些时间段内登录到系统的唯一用户的数量。例如:

SQL:

选择 案例 在castdatediffsecond、'01-01-1970 00:00:00'、'2018-07-23 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2018-12-09 23:59:59'作为varchar之间创建lsl.TIME时,2018年第二学期:2018年7月23日至2018年12月9日 然后是“2018年第二学期” 当在castdatediffsecond、'01-01-1970 00:00:00'、'2018-12-10 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2018-02-03 23:59:59'作为varchar之间创建lsl.time时,2018-19:10/12/2018至03/02/2019 然后是“圣诞假期,2018-19” 在castdatediffsecond、'01-01-1970 00:00:00'、'2019-02-04 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2019-06-23 23:59:59'作为varchar之间创建lsl.TIME时,2019年第1学期:2019年2月4日至2019年6月23日 然后是“2019年第一学期” else'圣诞假期,2018-19' 以“登录日期”结束, countdistinct lsl.userid为“唯一登录名”, lsl.行动 来自前缀\u日志存储\u标准\u日志lsl 其中lsl.action='loggedin'和 lsl.time在castdatediffsecond、'01-01-1970 00:00:00'、'2018-07-23 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2019-06-23 23:59:59'作为varchar之间创建 按lsl.timecreated、lsl.action分组 按lsl.timecreated asc订购 这将按预期列出各行上的数据:

------------------------------------------------------------
| Login Date               | # of Unique Logins | action   |
------------------------------------------------------------
| Semester 2, 2018         | 1                  | loggedin |
| Semester 2, 2018         | 1                  | loggedin |
| Semester 2, 2018         | 1                  | loggedin |
| Semester 2, 2018         | 1                  | loggedin |
| Christmas Break, 2018-19 | 1                  | loggedin |
| Christmas Break, 2018-19 | 1                  | loggedin |
| Christmas Break, 2018-19 | 1                  | loggedin |
| Semester 1, 2019         | 1                  | loggedin |
| Semester 1, 2019         | 1                  | loggedin |
------------------------------------------------------------
我需要将登录日期分组如下。我该怎么做

------------------------------------------------------------
| Login Date               | # of Unique Logins | action   |
------------------------------------------------------------
| Semester 2, 2018         | 4                  | loggedin |
| Christmas Break, 2018-19 | 3                  | loggedin |
| Semester 1, 2019         | 2                  | loggedin |
------------------------------------------------------------
我试图通过将相同的案例添加到组中,但它抛出了一个我不理解的错误:

... 分组 案例 在castdatediffsecond、'01-01-1970 00:00:00'、'2018-07-23 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2018-12-09 23:59:59'作为varchar之间创建lsl.TIME时,2018年第二学期:2018年7月23日至2018年12月9日 然后是“2018年第二学期” 当在castdatediffsecond、'01-01-1970 00:00:00'、'2018-12-10 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2018-02-03 23:59:59'作为varchar之间创建lsl.time时,2018-19:10/12/2018至03/02/2019 然后是“圣诞假期,2018-19” 在castdatediffsecond、'01-01-1970 00:00:00'、'2019-02-04 00:00:00'作为varchar和castdatediffsecond、'01-01-1970 00:00:00'、'2019-06-23 23:59:59'作为varchar之间创建lsl.TIME时,2019年第1学期:2019年2月4日至2019年6月23日 然后是“2019年第一学期” 终止 lsl.行动 按lsl.timecreated asc订购 错误:

SQLState:42000 错误代码:8120 列前缀_logstore_standard_log.timecreated在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中


您可以使用外部查询进行聚合

select "Login Date" , count("# of unique logins") , action
from (
    select
        case
            when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-12-09 23:59:59') as varchar) -- Semester 2, 2018: 23/07/2018 to 09/12/2018
                then 'Semester 2, 2018'
            when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-12-10 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-02-03 23:59:59') as varchar) -- Christmas Break, 2018-19: 10/12/2018 to 03/02/2019
                then 'Christmas Break, 2018-19'
            when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2019-02-04 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar) -- Semester 1, 2019: 04/02/2019 to 23/06/2019
                then 'Semester 1, 2019'
            else 'Christmas Break, 2018-19'
        end as 'Login Date',
        count(distinct lsl.userid) as '# of unique logins',
        lsl.action
    from prefix_logstore_standard_log lsl
    where lsl.action = 'loggedin' and
        (lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar))
    group by lsl.timecreated, lsl.action
    order by lsl.timecreated asc
) as a
group by "Login Date" , action

使用CTE公共表表达式,它应该可以解决您的问题

不幸的是,我没有您的数据要测试,但是,以下内容应该可以工作:

with cte ([Login Date],[# of Unique Logins],[action])
as
(
select
    case
        when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-12-09 23:59:59') as varchar) -- Semester 2, 2018: 23/07/2018 to 09/12/2018
            then 'Semester 2, 2018'
        when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-12-10 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-02-03 23:59:59') as varchar) -- Christmas Break, 2018-19: 10/12/2018 to 03/02/2019
            then 'Christmas Break, 2018-19'
        when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2019-02-04 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar) -- Semester 1, 2019: 04/02/2019 to 23/06/2019
            then 'Semester 1, 2019'
        else 'Christmas Break, 2018-19'
    end as 'Login Date',
    count(distinct lsl.userid) as '# of unique logins',
    lsl.action
from prefix_logstore_standard_log lsl
where lsl.action = 'loggedin' and
    (lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar))
group by lsl.timecreated, lsl.action
order by lsl.timecreated asc
)

select
*
from    cte
group by [Login Date],[# of Unique Logins],[action]

让我知道它是否有效。

您是否意外回复了错误的帖子?我看不出这段代码有什么关系。您也没有对代码所做的事情提供任何解释。我只是给出了如何对用例进行分组的示例
with cte ([Login Date],[# of Unique Logins],[action])
as
(
select
    case
        when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-12-09 23:59:59') as varchar) -- Semester 2, 2018: 23/07/2018 to 09/12/2018
            then 'Semester 2, 2018'
        when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-12-10 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2018-02-03 23:59:59') as varchar) -- Christmas Break, 2018-19: 10/12/2018 to 03/02/2019
            then 'Christmas Break, 2018-19'
        when lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2019-02-04 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar) -- Semester 1, 2019: 04/02/2019 to 23/06/2019
            then 'Semester 1, 2019'
        else 'Christmas Break, 2018-19'
    end as 'Login Date',
    count(distinct lsl.userid) as '# of unique logins',
    lsl.action
from prefix_logstore_standard_log lsl
where lsl.action = 'loggedin' and
    (lsl.timecreated between cast(datediff(second,'01-01-1970 00:00:00','2018-07-23 00:00:00') as varchar) and cast(datediff(second,'01-01-1970 00:00:00','2019-06-23 23:59:59') as varchar))
group by lsl.timecreated, lsl.action
order by lsl.timecreated asc
)

select
*
from    cte
group by [Login Date],[# of Unique Logins],[action]