我有表(UserReport),其中列出了缺少公司必需的AD属性的用户.在该表中,我有ReportDate列(这是我运行的每周报告的日期).我有一个不同的位置字段,名为Site Rolls Up to Department.我想给每个网站的最近3个报告日期和每个网站的计数历史支点.下面是我现在得到的.

SQL查询范围

SELECT division, site, reportdate, COUNT(reportdate) as CountUsers 
FROM UserReport
WHERE division = 'US South'
GROUP BY division, site, reportdate

结果

Division Site ReportDate CountUsers
US South Texas 2023-05-24 1
US South Florida 2023-05-24 1
US South Ohio   2023-05-24 1
US South Ohio   2023-05-26 1
US South Kansas 2023-05-19 5
US South Idaho   2023-05-24 1
US South Utah   2023-05-24 1
US South Georgia 2023-05-24 1
US South Georgia 2023-05-26 1

结果 that I want

Division Site 2023-05-19 2023-05-24 2023-05-26
US South Texas 0 1 0
US South Florida 0 1 0
US South Ohio   0 1 1
US South Kansas 5 0 0
US South Idaho   0 1 0
US South Utah   0 1 0
US South Georgia 0 1 1

推荐答案

你的核心方法遗漏了一些东西:把日期分成你需要的三个日期.一旦拆分了这些值,您就可以应用条件聚合,您将得到您的输出.

如果某一列没有任何非空值,则使用SUM代替COUNT可以避免出现问题.

SELECT division, 
       site, 
       SUM(CASE WHEN reportdate = '2023-05-19' THEN 1 ELSE 0 END) AS date1, 
       SUM(CASE WHEN reportdate = '2023-05-24' THEN 1 ELSE 0 END) AS date2,
       SUM(CASE WHEN reportdate = '2023-05-26' THEN 1 ELSE 0 END) AS date3
FROM UserReport
WHERE division = 'US South'
GROUP BY division, site

这应该很好,因为你表示你只想要最后三次约会.

尽管如果将来需要在日期上进行泛化,那么您将需要一个动态查询,它的性能更重,并且有一些相关的问题.执行此类查询还需要了解您当前使用的DBMS,因 for each DBMS使用不同的语法进行动态查询.

Sql相关问答推荐

如何以"% m—% d"格式对生日列表进行排序,以查找与今天最近的日期?

在多个柱上连接时,如何确定连接条件?

数据库索引:如何使用名称和类别对项目进行最佳索引?

计算周时出现SQL错误结果

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

NULL-生成的列中连接的字符串的输入

SQL:如何在表中同时使用GROUPING和CONDITION?

动态组/转置

了解多个分组集

对于多字节字符,SQL Server中的DATALENGTH返回1字节

按属性值 Select 数组元素Postgres Jsonb

嵌套Json对象的SQL UPDATE WHERE

查找滑动窗口框架中的最大和最小列值

如何计算两个非周期性时间序列+分组的重叠持续时间

标量子查询中的窗口函数不起作用

IN子句使用的表值用户定义函数参数

比使用NOT EXISTS更高效的SQL删除方法是什么?

为重复的项目编号显示正在处理

SQL Server 查找存在于所有不同时期(或序列)中的条目

有没有一种方法可以将始终遵循序列的单个字段的值组合起来,以创建每个 ID 的所有移动?