2014-01-13 83 views
4

我需要制定一個t-sql查詢,到目前爲止,我一直無法這樣做。我需要查詢的表稱爲具有兩列的操作,一個FK OperationTypeID和一個OperationDate。查詢需要返回一個結果,該結果包含指定範圍內的操作類型id的計數。SQL查詢與分組由多個日期範圍

通過應用程序界面,用戶可以指定多個operationtypeIds以及它們各自的日期例如範圍是這樣,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 | 
+---------------+----------+----------+-----+ 

....等等

將不勝感激,如果有人可以提供幫助。查詢需要根據用戶指定的最小/最大日期範圍爲每個操作類型標識返回一個計數。 sql服務器中可用的最小/最大函數可能不適用於此處。我迄今爲止想到的一種可能的方法是使用Union All方法,在這種方法中,我根據日期範圍爲單個操作類型id制定單個查詢,然後執行UNION All,任何性能影響?

+1

我不明白的問題:-( – SamB

+0

凡日期範圍爲每'OPERAT ionTypeID'從哪裏來? – peterm

+0

@John你可以發佈你想要實現的示例輸出嗎?正如SamB所說,這個問題有點不清楚。 – Mureinik

回答

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) 
+0

謝謝丹,我將採用第二種方法。不知道你可以在查詢時間創建這樣的表。 – John