0

我有一个orders带有列orderid和的表OrderDate

我想以 5 年为单位获取数据,例如 SQL Server 中 1990-1995、1995-2000、2000-2005 等之间的总订单。

例如 :

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

提前致谢

4

4 回答 4

0

您可以按 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)
于 2013-10-15T06:44:24.217 回答
0

此解决方案为您提供所需的输出 - 请参阅下面的 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

sql fiddle demo

在这里,我使用 cte,因此您不必在group by子句和中重复您的代码两次select。您可以轻松地将 cte 切换到子查询,但我认为 cte 更清晰,更易于阅读。

于 2013-10-15T06:49:35.077 回答
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

希望这可以帮助

于 2013-10-15T06:57:09.357 回答
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

于 2013-10-15T07:07:34.043 回答