2013-06-28 24 views
3

的分組由這是我的表Orders上的SQL一系列一年

enter image description here

如果我想有訂單的每個準確年份計,我簡直可以寫這個查詢

Select COUNT(*) CountOfOrders, Year(OrderDate) Year 
From Orders 
Group by YEAR(OrderDate) 

所以具有該結果集

enter image description here

但是如果我需要這個結果集,該怎麼辦?

CoundOfOrder  FromYear_toYear 
    5   2005-2010 
    4   2010-2015 
+0

你怎麼做期間之間的截止? 「2010-2015」不應該有5或6個(取決於如果你在這兩個時期計算2010年)? – jpw

+0

根據您的示例數據和結果,無法確定2010計入的範圍。 –

+0

@jpw:它可以是可選的。由2年,3年或5年。這取決於數據。如你所見,2011年沒有訂單。 –

回答

6

你可以試試這個查詢。這將以最簡單的方式幫助你。

SELECT COUNT(*),(CONVERT(VARCHAR,MIN(year(orderdate)))+'-' + CONVERT(VARCHAR,MAX(year(orderdate)))) AS yearRange 
FROM orders 
GROUP BY FLOOR(Year(OrderDate) /5) 

你可以參考使用你的榜樣,形成此查詢的鏈接SQL_Fiddle_Link

3
Select COUNT(*) CountOfOrders, 
CASE WHEN Year(OrderDate) BETWEEN 2005 AND 2009 THEN '2005-2009' 
    WHEN Year(OrderDate) BETWEEN 2010 AND 2015 THEN '2010-2015' 
END AS Year 
From Orders 
Group by 
CASE WHEN Year(OrderDate) BETWEEN 2005 AND 2009 THEN '2005-2009' 
    WHEN Year(OrderDate) BETWEEN 2010 AND 2015 THEN '2010-2015' 
END 

請注意,我調整了您的日期範圍,否則你不會得到有意義的數據,在2類計數一些事情。

+0

tombom;那麼,如果我們有大量的數據呢?有沒有動態的方法,而不是硬編碼?還有一點可能是用戶想要指定範圍。有時候5或2或其他。 –

+0

您必須編寫一個過程,在該過程中您首先使用動態sql創建語句。但是因爲將多個日期範圍傳遞給一個過程可能很困難,所以我不會在數據庫層上執行它。 – fancyPants