我需要制定一个t-sql查询,到目前为止我一直无法这样做。我需要查询的表称为具有两列的操作,FK OperationTypeID和OperationDate。查询需要返回一个结果,该结果包含指定范围内的操作类型id的计数。
通过应用程序界面,用户可以指定多个operationtype
Ids
以及各自的日期范围,例如,可以在范围内查找operationtype id
'A'
可以在22/04/2010
到22/04/2012
中搜索operationtype Id
到15/10/2012
和15/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进行任何性能影响吗?
答案 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)