如何将n个SELECT结果存储到变量中?

时间:2018-02-21 04:25:51

标签: sql sql-server tsql

所以,我有这个声明,它返回客户所做订单的OrderDates。我试图将订单日期存储到变量或多个变量中,以计算平均值。

我知道,对于特定的结果,我们可以做这样的事情

DECLARE @tempvar DATE
SET @tempvar = (SELECT OrderDate From Orders WHERE CustID = '1234')

但问题是,如果select语句返回可变数量的结果(变量行),如0结果或2结果或4?

我知道我们可以通过@@ROWCOUNT变量获取select语句返回的行数。

为了简单地说明我的问题,我需要存储select语句返回的最新和最旧日期,并将其除以返回的行数。

2 个答案:

答案 0 :(得分:3)

如果您的主要目标是获取日期的平均值,那么您不需要将日期存储到变量中,您可以直接执行以下操作。

SELECT CAST(AVG(CAST(OrderDate AS FLOAT)) AS DATETIME) FROM Orders WHERE CustID = '1234'

您还可以将所有日期的平均值存储在变量中,您可以像下面这样进行。

 DECLARE @AvgDate DATETIME
 SELECT @AvgDate =  CAST(AVG(CAST(OrderDate AS FLOAT)) AS DATETIME) 
 FROM Orders WHERE CustID = '1234'

如果您想将日期存储到某个变量中,在这种情况下要存储多于1个值,请选择以下表格数据类型。

DECLARE @OrderDates TABLE(OrderDate DATETIME)


INSERT INTO @OrderDates(OrderDate)
SELECT OrderDate From [Orders] WHERE CustID = '1234'

--TO GET AVG
SELECT CAST(AVG(CAST(OrderDate AS FLOAT)) AS DATETIME) FROM @OrderDates ;
-- RETURNS ALL ROW
SELECT * FROM @OrderDates 

编辑:

  

换句话说,我需要在两者之间获得天数   SELECT语句返回的最高和最小日期

要查找MAX日期和最短日期之间的天数,您可以执行以下操作。

SELECT  DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM @OrderDates 

OR

  SELECT DATEDIFF(day, MIN(OrderDate), MAX(OrderDate))   FROM Orders WHERE CustID = '1234'

答案 1 :(得分:1)

我认为只需一行代码即可获得您想要的内容:

select dateadd(d, avg(datediff(d, '1970-01-01', OrderDate)), '19700101') from Orders where CustID = '1234'

在回复以下评论时,请尝试:

select  
        dateadd(d, datediff(d, '1970-01-01', max(OrderDate)) - datediff(d, '1970-01-01', min(OrderDate)) / count(*), '1970-01-01') as requested_calc,
        dateadd(d, avg(datediff(d, '1970-01-01', OrderDate)), '19700101') as avg_date
    from Orders 
    where CustID = '1234'

但是对于我的生活,我不明白为什么你会想要这个计算。所以我也保留了另一个。

我希望这会有所帮助。