我有一个orders
带有列orderid
和的表OrderDate
。
我想以 5 年为单位获取数据,例如 SQL Server 中 1990-1995、1995-2000、2000-2005 等之间的总订单。
例如 :
Period Orders
1990-1995 4500
1995-2000 7000
2000-2005 9000
提前致谢
我有一个orders
带有列orderid
和的表OrderDate
。
我想以 5 年为单位获取数据,例如 SQL Server 中 1990-1995、1995-2000、2000-2005 等之间的总订单。
例如 :
Period Orders
1990-1995 4500
1995-2000 7000
2000-2005 9000
提前致谢
您可以按 YEAR 功能分组 - 这将按每年进行分组,例如:
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)
此解决方案为您提供所需的输出 - 请参阅下面的 sql fiddle:
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 更清晰,更易于阅读。
我认为这是一种清晰的语法,使用一个子查询:
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
希望这可以帮助
干得好:
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