我有一個表orders
,列orderid
和OrderDate
。在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
在此先感謝
我有一個表orders
,列orderid
和OrderDate
。在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
在此先感謝
我認爲這是一個明顯的語法,使用一個子查詢:
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
希望這有助於
你可以從年份功能組 - 這將做到每年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)
感謝llya的快速反應,但我沒有明白你的觀點。你能詳細解釋一下嗎?我的表名是訂單,它有2列orderid和orderdate。 – Anand
@我的觀點:你需要在一個小組內總結幾個訂單,你說你需要像「1990-1995」,「1995-2000」這樣的小組,對我來說,看起來從1995年開始的訂單會在兩個小組中完成,重複的,但它顯然是錯誤的財務,所以我想你需要或者1990-1994和1995-1999或1991-1995和1996-2000 –
@llya,我剛剛嘗試過「選擇YEAR(OrderDate),總和(OrderID) from [Max]。[dbo]。[Orders] group by FLOOR((YEAR(OrderDate)+1)/ 5)「但是出現錯誤: - 」列'Max.dbo.Orders.OrderDate'在選擇列表,因爲它不包含在聚合函數或GROUP BY子句中。「,謝謝 – Anand
該解決方案爲您提供了所需的輸出 - 參見下面的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
這裏我使用cte所以你不必在group by
子句和select
兩次重複你的代碼。您可以輕鬆地將cte切換到子查詢,但我認爲cte更清晰,更易於閱讀。
在這裏你去:
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
與我的回答有什麼不同? –
哪個時期的數據是1995年的數據? –
'訂單'字段包含訂單或什麼的價格。 –
@Vishal感謝您的回覆,是的,它也包含其他專欄,但我只想計算每5年的訂單數量。 – Anand