Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:如何获取上一年的数据并在输出中创建行_Sql_Sql Server - Fatal编程技术网

SQL Server:如何获取上一年的数据并在输出中创建行

SQL Server:如何获取上一年的数据并在输出中创建行,sql,sql-server,Sql,Sql Server,我的送货表如下: 我想知道交货期的长短。2010年交付的车辆将按2010年0龄、2011年1龄和2012年2龄计算,依此类推 请帮助我了解如何在SQL查询中执行此操作。我是这个论坛的新手,所以没有添加图片的权限 SELECT DATEDIFF(year, '2011/08/25', getdate()) AS DateDiff 这将为您提供车辆的年龄,并使用group by子句根据所需的年数获取值 这将为您提供车辆的年龄,并使用group by子句根据所需的年份获取值 select yea

我的送货表如下:

我想知道交货期的长短。2010年交付的车辆将按2010年0龄、2011年1龄和2012年2龄计算,依此类推

请帮助我了解如何在SQL查询中执行此操作。我是这个论坛的新手,所以没有添加图片的权限

SELECT DATEDIFF(year, '2011/08/25', getdate()) AS DateDiff
这将为您提供车辆的年龄,并使用group by子句根据所需的年数获取值


这将为您提供车辆的年龄,并使用group by子句根据所需的年份获取值

select year(deliverydate)
       ,(year(deliverydate)-2010) as age_of_vehicle
       ,count(vehicleid)
  from table
group by year(deliverydate)

这里有一个方法可以做到这一点

select year(deliverydate)
       ,(year(deliverydate)-2010) as age_of_vehicle
       ,count(vehicleid)
  from table
group by year(deliverydate)

我确信有更好的方法(递归cte),但下面也给出了正确的结果:

;with cte as
(
    select YEAR(CONVERT(VARCHAR(10), CONVERT(date, DeliveryDate, 105), 23)) [Year], 0 Age
    from vehicle v
)

select * into #temp
from cte
union all
select t1.[Year]+ (t2.[Year] - t1.[Year]), (t2.[Year] - t1.[Year]) as Age
from cte t1
join (select distinct [Year], Age from cte) t2 on t2.[Year] > t1.[Year]

select [Year], Age AgeofVehicle, COUNT(1) Deliveries
from #temp
group by [Year], Age
order by [Year], Age

请参阅DBFIDLE我确信有更好的方法(递归cte),但下面也给出了正确的结果:

;with cte as
(
    select YEAR(CONVERT(VARCHAR(10), CONVERT(date, DeliveryDate, 105), 23)) [Year], 0 Age
    from vehicle v
)

select * into #temp
from cte
union all
select t1.[Year]+ (t2.[Year] - t1.[Year]), (t2.[Year] - t1.[Year]) as Age
from cte t1
join (select distinct [Year], Age from cte) t2 on t2.[Year] > t1.[Year]

select [Year], Age AgeofVehicle, COUNT(1) Deliveries
from #temp
group by [Year], Age
order by [Year], Age

请查看DBFIDLE

假设您每年都有交付,我将其视为一个
加入和聚合:

with years as (
      select distinct year(deliverydate) as yyyy
      from vehicle
     )
select y.yyyy, (y.yyyy - year(v.deliverydate)) as age , count(*)
from vehicle v join
     years y
     on y.yyyy >= year(v.deliverydate) 
group by y.yyyy, (y.yyyy - year(v.deliverydate))
order by y.yyyy, (y.yyyy - year(v.deliverydate));
如果您没有每年发货,您可以明确列出:

select y.yyyy, (y.yyyy - year(v.deliverydate)) as age , count(*)
from vehicle v join
     (values (2010), (2011), (2012), (2013)) y(yyyy)
     on y.yyyy >= year(v.deliverydate) 
group by y.yyyy, (y.yyyy - year(v.deliverydate))
order by y.yyyy, (y.yyyy - year(v.deliverydate));

是一个数据小提琴。

假设您每年都有交付,我认为这是一个
加入和聚合:

with years as (
      select distinct year(deliverydate) as yyyy
      from vehicle
     )
select y.yyyy, (y.yyyy - year(v.deliverydate)) as age , count(*)
from vehicle v join
     years y
     on y.yyyy >= year(v.deliverydate) 
group by y.yyyy, (y.yyyy - year(v.deliverydate))
order by y.yyyy, (y.yyyy - year(v.deliverydate));
如果您没有每年发货,您可以明确列出:

select y.yyyy, (y.yyyy - year(v.deliverydate)) as age , count(*)
from vehicle v join
     (values (2010), (2011), (2012), (2013)) y(yyyy)
     on y.yyyy >= year(v.deliverydate) 
group by y.yyyy, (y.yyyy - year(v.deliverydate))
order by y.yyyy, (y.yyyy - year(v.deliverydate));

是dbfiddle。

即使您有权限,也不应添加图像。请删除这些图像链接,而是将所有表数据作为文本包含。您的输入数据和输出数据不同步。请提供正确的示例数据。即使您有权限,也不应添加图像。请删除这些图像链接,而是将所有表数据作为文本包含。您的输入数据和输出数据不同步。请提供正确的样本数据。但这并没有给出预期的产量-2010年交付的车辆将在2010年计为0龄,2011年计为1龄,2012年计为2龄,依此类推。您能否分享预期产量。还有一个解释。2011年,您的车龄为0,计为2。您是如何得出该数字的?但这并没有给出所需的产量-2010年交付的车辆将在2010年计为0龄,2011年计为1龄,2012年计为2龄,依此类推。您能分享预期产量吗。还有一个解释。2011年,您的车龄为0,计为2。你是怎么得出这个数字的