首页 > 解决方案 > 在 MSSQL 中编写查询以获取最近 30 天的报告

问题描述

我想创建一个报告基础,

潜在客户名称 经核实 验证日期
铅 1 美国广播公司 2021 年 11 月 2 日
铅 2 KMJ 2021 年 9 月 2 日
铅 3 美国广播公司 2021 年 11 月 2 日

报告看起来像,考虑今天的日期为12-02-2021,我们需要为员工工作计数创建过去 30 天的报告

用户 2021 年 12 月 2 日 2021 年 11 月 2 日 2021 年 10 月 2 日 2021 年 9 月 2 日 2021 年 8 月 2 日 2021 年 7 月 2 日 依此类推,直到最后 30 天
美国广播公司 0 2 0 0 0 0
XYZ 0 0 0 0 0 0
KMJ 0 0 0 1 0 0

我已经编写了如下的 MSSQL 查询, CAST(lead.CREATED_ON as date) between cast(DATEADD(day, -30, getdate()) as date) and CAST(getdate() as date) 但是,我无法获取以下格式的数据,并且如果某个日期没有条目,则该日期应在所有用户面前显示 0

用户 2021 年 12 月 2 日 2021 年 11 月 2 日 2021 年 10 月 2 日 2021 年 9 月 2 日 2021 年 8 月 2 日 2021 年 7 月 2 日 很快

请帮我完成这个查询,如果可能的话,请分享任何文章链接,这对我有很大帮助谢谢

标签: sqlsql-server

解决方案


首先,日期真的像那样存储为字符串吗?如果是这样,那将是一个大问题,将使本已困难的情况变得更糟。重要的是,您应该将当前模式视为积极破坏

继续前进,处理这种情况的最正确方法是在客户端代码或报告工具中透视数据。也就是说,从 SQL 数据库返回一个结果集,看起来更像这样:

用户 | 日期 | 价值
 美国广播公司 | 2021-02-12 | 0
 美国广播公司 | 2021-02-12 | 2
 美国广播公司 | 2021-02-10 | 0
 美国广播公司 | 2021-02-09 | 0
 美国广播公司 | 2021-02-08 | 0
 美国广播公司 | 2021-02-07 | 0
 XYZ | 2021-02-12 | 0
 XYZ | 2021-02-12 | 0
 XYZ | 2021-02-10 | 0
 XYZ | 2021-02-09 | 0
 XYZ | 2021-02-08 | 0
 XYZ | 2021-02-07 | 0
... 等等

然后让客户端按照您的意愿重新格式化这些数据,而不是要求服务器通常以每个 cpu 内核数千美元的价格获得许可,并且不适合执行这项工作的任务。

但是,如果您真的必须在数据库服务器上执行此操作,您应该知道SQL 语言有非常严格的要求,即在查看任何数据之前,在查询评估时了解输出中列的数量、名称和类型。甚至SELECT *尊重这一点,因为*它基于提前知道的表定义。

如果输出在查看数据之前不知道有多少列,则必须分 3 个步骤执行此操作:

  1. 运行查询以获取有关列的数据。
  2. 使用步骤 1 的结果动态构建新查询。
  3. 运行新查询。

但是,由于您似乎总是需要正好 30 天的数据,如果您愿意将列命名为更像, , , ... ,则可以使用关键字在单个查询中执行此操作PIVOT例如无论当前日期如何,您都可以在数据透视代码中引用它们。OneDayBackTwoDaysBackThreeDaysBackThirtyDaysBack


推荐阅读