sql - 如何统计某个日期范围内的数据库元素?

标签 sql sql-server reporting-services group-by

在 SQL Server 过程中,我需要获取与某些约束(简单的 where 条件)匹配的所有行,然后按月对它们进行分组。

目标是创建一个图表(在 Sql 服务器报告服务中),显示所有数据。

我已经做了这样的事情:

Select Count(*) AS Count, Month(a.issueDate) AS Month, Year(a.issueDate) AS Year
FROM MyTable a
WHERE
....
GROUP BY YEAR(a.issueDate), MONTH(a.issueDate)

我得到了我的数据,我得到了我的图表,但问题是,如果我在“MyTable”中没有任何与我的Where条件匹配的行,我不会有任何行。

结果是我有一个图表,从一月开始,跳过二月,然后显示三月。

我无法对数据进行后处理,因为它直接连接到 SQL Server Reporting Services 报表。

由于我在大约 20 个存储过程中遇到了这个问题,因此我很高兴能有最简单的方法来实现它。

非常感谢您的建议

最佳答案

假设您想要特定的年份:

DECLARE @year INT;
SET @year = 2012;

DECLARE @start SMALLDATETIME;
SET @start = DATEADD(YEAR, @year-1900, 0);

;WITH y AS (SELECT TOP (12) rn = ROW_NUMBER() OVER (ORDER BY [object_id])-1
  FROM sys.all_objects ORDER BY [object_id])
SELECT DATEADD(MONTH, y.rn, @start), COUNT(t.issueDate)
  FROM y
  LEFT OUTER JOIN dbo.MyTable AS t
  ON t.issueDate >= DATEADD(MONTH, y.rn, @start)
  AND t.issueDate < DATEADD(MONTH, y.rn + 1, @start)
GROUP BY DATEADD(MONTH, y.rn, @start);

如果不是特定年份,那么您可以稍微不同地覆盖任何日期范围,只要您提供第一个月的第一天和最后一个月的第一天(或传递 4 个整数并构造手动日期):

DECLARE @startdate SMALLDATETIME, @enddate SMALLDATETIME;
SELECT @startdate = '20111201', @enddate = '20120201';

;WITH y AS (SELECT TOP (DATEDIFF(MONTH, @startdate, @enddate)+1)
    rn = ROW_NUMBER() OVER (ORDER BY [object_id])-1
    FROM sys.all_objects ORDER BY [object_id]
)
SELECT DATEADD(MONTH, y.rn, @startdate), COUNT(t.issueDate)
  FROM y
  LEFT OUTER JOIN dbo.MyTable AS t
  ON t.issueDate >= DATEADD(MONTH, y.rn, @startdate)
  AND t.issueDate < DATEADD(MONTH, y.rn + 1, @startdate)
GROUP BY DATEADD(MONTH, y.rn, @startdate);

关于sql - 如何统计某个日期范围内的数据库元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11347133/

相关文章:

reporting-services - 无法创建与 SSRS 中的数据源错误 (rsErrorOpeningConnection) 的连接

php - 创建用于登录 PHP 的 Prepared 语句时出错

sql - 嵌套 SELECT 语句

reporting-services - SSRS 本地报告失败 - 错误 "An error has occurred during report processing"

sql - 如何在没有序列的情况下自动增加 SQL Server 2016 合并插入中的主键?

c# - 如何在 GridView 中拥有具有相同字段但不同值的两列

django - PostgreSQL的报告工具

sql - 甲骨文10g : parsing 2 columns merging duplicates

sql - BigQuery UNNEST 无结果

mysql - 从表 A 中获取不在表 B 中的记录