2013-10-15 23 views
0

我有一個表orders,列orderidOrderDate在SQL Server中每5年之間獲取數據(如1990-1995,1995-2000,2000-2005)

我想要在5年內批量獲取數據,例如SQL Server中的1990-1995,1995-2000,2000-2005等總訂單。

例如:

Period   Orders 
1990-1995  4500 
1995-2000  7000 
2000-2005  9000 

在此先感謝

+0

哪個時期的數據是1995年的數據? –

+0

'訂單'字段包含訂單或什麼的價格。 –

+0

@Vishal感謝您的回覆,是的,它也包含其他專欄,但我只想計算每5年的訂單數量。 – Anand

回答

0

我認爲這是一個明顯的語法,使用一個子查詢:

SELECT CAST(T.YearDivision * 5 AS nchar(4)) + N' - ' + CAST(T.YearDivision * 5 + 4 AS nchar(4)) AS YearRange, SUM(T.TotalCount) AS TotalOrders 
FROM 
(
    SELECT YEAR(Date)/5 AS YearDivision, Date, COUNT(*) AS TotalCount 
    FROM Orders 
    GROUP BY Date 
) T 
GROUP BY YearDivision 

我認爲你是重疊的一年範圍末和每個連續的範圍開始重複年。我在這裏刪除重疊。

這是對我的數據庫之一的樣品臺這個查詢結果:

YearRange TotalOrders 
----------- ----------- 
2005 - 2009 2680 
2010 - 2014 1395 

希望這有助於

+0

謝謝@Jaime,它解決了我的問題,它現在正在工作。 – Anand

+0

@Anand你試過我的解決方案嗎?它只是一個而不是兩個組合 –

+0

@Jaime如何投票並接受它作爲答案,請指導。感謝羅馬,我也試過你的解決方案,它也在工作,但不知道兩者的區別。 – Anand

0

你可以從年份功能組 - 這將做到每年groupping,如:

select YEAR(d), sum(...) 
from table 
group by YEAR(d) 

如果要合併幾年到一 - 考慮簡單的數學:

select FLOOR(YEAR(d)/5)*5, sum(...) 
from table 
group by FLOOR(YEAR(d)/5) 

與此組您將有[1990-1994] [1995-1999] [2000-2004]([和]包含性意味着)

,如果你想改變它要有[1991-1995] [1996 -2000]等,用途:

select FLOOR((YEAR(d)+1)/5)*5-1, sum(...) 
from table 
group by FLOOR((YEAR(d)+1)/5) 
+0

感謝llya的快速反應,但我沒有明白你的觀點。你能詳細解釋一下嗎?我的表名是訂單,它有2列orderid和orderdate。 – Anand

+0

@我的觀點:你需要在一個小組內總結幾個訂單,你說你需要像「1990-1995」,「1995-2000」這樣的小組,對我來說,看起來從1995年開始的訂單會在兩個小組中完成,重複的,但它顯然是錯誤的財務,所以我想你需要或者1990-1994和1995-1999或1991-1995和1996-2000 –

+0

@llya,我剛剛嘗試過「選擇YEAR(OrderDate),總和(OrderID) from [Max]。[dbo]。[Orders] group by FLOOR((YEAR(OrderDate)+1)/ 5)「但是出現錯誤: - 」列'Max.dbo.Orders.OrderDate'在選擇列表,因爲它不包含在聚合函數或GROUP BY子句中。「,謝謝 – Anand

0

該解決方案爲您提供了所需的輸出 - 參見下面的SQL小提琴:

with cte as (
    select 
     (year(OrderDate)/5) * 5 as y 
    from orders 
) 
select 
    cast(y as nvarchar(4)) + '-' + cast(y + 5 as nvarchar(4)) as Period, 
    count(*) as Orders 
from cte 
group by y 

sql fiddle demo

這裏我使用cte所以你不必在group by子句和select兩次重複你的代碼。您可以輕鬆地將cte切換到子查詢,但我認爲cte更清晰,更易於閱讀。

0

在這裏你去:

with cte as (
    select 
     (year(OrderDate)/5) as y, Orders 
    from orders 
) 
select count(*) as No_Of_Orders, 
    CAST(y * 5 AS nchar(4)) + N' - ' + CAST(y * 5 + 4 AS nchar(4)) AS Year_Range, 
    sum(Orders) Total_Price 
from cte 
group by FLOOR(YEAR(y)/5),y 

輸出:

NO_OF_ORDERS Year_Range Total_Price 
--------------------------------------- 
4    1995 - 1999  2101 
1    2000 - 2004  700 
1    2005 - 2009  400 

SQL Fiddle Demo

+0

與我的回答有什麼不同? –

相關問題