带多个日期范围的分组依据的SQL查询

Joh*_*ohn 5 sql t-sql sql-server group-by sql-server-2008

我需要制定一个T-SQL查询,到目前为止,我一直无法这样做。我需要查询的表称为带有两列的操作,即FK OperationTypeID和OperationDate。查询需要返回一个结果,该结果包括在指定范围内的操作类型id的计数。

通过接口的用户应用程序可以指定多个operationtype Ids,以及它们各自的日期范围,从而,例如,在operationtype id“A”可以在的范围内寻找 22/04/201022/04/2012operationtype Id“B”可以被搜索15/10/201215/11/2013等等其他operation type ids。现在,我需要在为单个操作类型ID指定的每个范围内,为每个操作类型ID返回一个计数。

考虑到性能问题,在单个t-sql查询中实现此目标的最有效方法是什么...下面提供的粗略布局,我不太擅长格式化,因此我希望它能给出一个主意。

+---------------+----------+----------+-----+
|OperationTypeID|Min date  |Max Date  |Count|
+---------------+----------+----------+-----+
|A              |22/04/2010|22/04/2012|899  |
+---------------+----------+----------+-----+
|B              |15/10/2012|15/11/2013|789  |
+---------------+----------+----------+-----+
Run Code Online (Sandbox Code Playgroud)

.... 等等

如果有人可以帮助,将不胜感激。查询需要根据用户指定的最小/最大日期范围返回每个操作类型ID的计数。SQL Server中可用的最小/最大函数可能不适用于此处。到目前为止,我想到的一种可能的方法是使用Union All方法,在该方法中,我根据日期范围为单个操作类型ID制定了单个查询,然后对UNION All做任何性能影响?

Dan*_*Dan 6

您需要将搜索条件存储在某处。最好的地方,可能是一个包含以下列的临时表:

CREATE TABLE #SearchCriteria (
    OperationTypeId VARCHAR(1)
    MinDate DATETIME
    MaxDate DATETIME
)
Run Code Online (Sandbox Code Playgroud)

现在,一旦你填充了这个表,一个像这样的简单查询应该会给你你想要的:

SELECT OperationTypeId, 
    MinDate, 
    MaxDate,
    (SELECT COUNT(*) FROM Operations 
      WHERE OperationDate BETWEEN SC.MinDate AND SC.MaxDate 
        AND OperationTypeId = SC.OperationTypeId) AS [Count]
FROM
    #SearchCriteria SC
Run Code Online (Sandbox Code Playgroud)

如果您必须在单个查询中包含所有内容(不使用临时表),请执行以下操作:

SELECT OperationTypeId, 
    MinDate, 
    MaxDate,
    (SELECT COUNT(*) FROM Operations 
      WHERE OperationDate BETWEEN SC.MinDate AND SC.MaxDate 
        AND OperationTypeId = SC.OperationTypeId) AS [Count]
FROM
    (VALUES ('A', '22/04/2010', '22/04/2012')
           ,('B', '15/10/2012', '15/11/2013')
         /* ... etc ... */
    ) SC(OperationTypeId, MinDate, MaxDate)
Run Code Online (Sandbox Code Playgroud)