带有group by的SQL查询,用于多个日期范围

时间:2014-01-13 06:08:16

标签: sql sql-server sql-server-2008 tsql group-by

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

通过应用程序界面,用户可以指定多个operationtype Ids以及各自的日期范围,例如,可以在范围内查找operationtype id'A' 可以在22/04/201022/04/2012中搜索operationtype Id15/10/201215/11/2013'B',依此类推其他operation type ids。现在,我需要在为各个操作类型ID指定的每个范围内返回每个operationtype id的计数。

考虑到性能问题,在单个t-sql查询中实现这一目标的最有效方法是什么...下面给出的粗略布局,我不太擅长格式化,所以我希望它仍然会给出一个想法。< / p>

+---------------+----------+----------+-----+
|OperationTypeID|Min date  |Max Date  |Count|
+---------------+----------+----------+-----+
|A              |22/04/2010|22/04/2012|899  |
+---------------+----------+----------+-----+
|B              |15/10/2012|15/11/2013|789  |
+---------------+----------+----------+-----+

....等等

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

1 个答案:

答案 0 :(得分:2)

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

CREATE TABLE #SearchCriteria (
    OperationTypeId VARCHAR(1)
    MinDate DATETIME
    MaxDate DATETIME
)

现在,一旦你填充了这个表,这样一个简单的查询就可以给你你想要的东西:

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

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

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)
相关问题