我需要制定一个 t-sql 查询,但到目前为止我还无法这样做。我需要查询的表称为“Operations”,具有两列:FK OperationTypeID 和OperationDate。查询需要返回一个结果,该结果包含指定范围内操作类型id的计数。
通过应用程序界面,用户可以指定多个操作类型
Id
以及它们各自的日期范围,例如操作类型id
'可以在范围内寻找A'
22/04/2010
至 22/04/2012
和 operationtype Id
'B' 可以在 15/10/2012 中搜索
到 15/11/2013
等其他操作类型 ID
。现在,我需要在为各个操作类型 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 |
+---------------+----------+----------+-----+
...等等
如果有人能提供帮助,我将不胜感激。查询需要根据用户指定的最小/最大日期范围返回每个操作类型 ID 的计数。 sql server 中可用的 Min/Max 函数可能不适用于此处。到目前为止,我想到的一种可能的方法是使用 Union All 方法,在该方法中,我根据日期范围对单个操作类型 id 制定单个查询,然后执行 UNION All,对性能有影响吗?
最佳答案
您需要将搜索条件存储在某处。最好的地方可能是一个包含以下列的临时表:
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)
关于对多个日期范围进行分组的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21084906/