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/2010到22/04/2012和operationtype Id“B”可以被搜索15/10/2012到15/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做任何性能影响?
您需要将搜索条件存储在某处。最好的地方,可能是一个包含以下列的临时表:
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)
| 归档时间: |
|
| 查看次数: |
6081 次 |
| 最近记录: |