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

Sql 如何将n个SELECT结果存储到变量中?,sql,sql-server,tsql,Sql,Sql Server,Tsql,所以,我有一条语句,它返回客户所有订单的订单日期。我试图将orderdates存储到一个变量或多个变量中,以计算平均值 我知道,对于一个特定的结果,我们可以这样做 DECLARE @tempvar DATE SET @tempvar = (SELECT OrderDate From Orders WHERE CustID = '1234') 但问题是,若select语句返回数量可变的结果(可变行),比如0个结果、2个结果或4个结果,那个么会怎么样 我知道我们可以通过@@ROWCOUNT变量获取

所以,我有一条语句,它返回客户所有订单的订单日期。我试图将orderdates存储到一个变量或多个变量中,以计算平均值

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

DECLARE @tempvar DATE
SET @tempvar = (SELECT OrderDate From Orders WHERE CustID = '1234')
但问题是,若select语句返回数量可变的结果(可变行),比如0个结果、2个结果或4个结果,那个么会怎么样

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


用更简单的话来说,我需要存储select语句返回的最新和最旧日期,并将其除以返回的行数。

如果您的主要目标是获得日期的平均值,那么您不需要将日期存储到变量中,您可以像下面这样直接执行

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'
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  DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM @OrderDates 
您还可以将所有日期的平均值存储在一个变量中,您可以像下面这样做

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'
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  DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM @OrderDates 
不过,如果您想将日期存储到某个变量中,在这种情况下,要存储多个值,最好选择如下表数据类型

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'
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  DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM @OrderDates 
编辑:

换言之,我需要得到两个时间间隔的天数 SELECT语句返回的最高和最小日期

要查找最大日期和最小日期之间的天数,可以执行以下操作

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'
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  DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM @OrderDates 


如果您的主要目标是获得日期的平均值,那么您不需要将日期存储到变量中,您可以像下面这样直接执行

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'
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  DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM @OrderDates 
您还可以将所有日期的平均值存储在一个变量中,您可以像下面这样做

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'
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  DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM @OrderDates 
不过,如果您想将日期存储到某个变量中,在这种情况下,要存储多个值,最好选择如下表数据类型

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'
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  DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM @OrderDates 
编辑:

换言之,我需要得到两个时间间隔的天数 SELECT语句返回的最高和最小日期

要查找最大日期和最小日期之间的天数,可以执行以下操作

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'
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  DATEDIFF(day, MIN(OrderDate), MAX(OrderDate)) FROM @OrderDates 


我认为这只需一行代码即可满足您的需求:

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'
但就我个人而言,我不明白你为什么要这个计算。所以我也保留了另一个


我希望这会有所帮助。

我认为这只需一行代码即可满足您的需求:

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'
但就我个人而言,我不明白你为什么要这个计算。所以我也保留了另一个



我希望这有帮助。

使用表值参数的过程或使用CTEWhat是您的最终要求。另外,你能不能请一些你需要的样本行和预期输出。数学方面的注意:要计算平均值,你需要加(而不是减)这些值,然后除以它们的计数。现在回到你的问题,在查询中计算平均值很容易,所以你不需要自己去做。告诉我们您试图计算其平均值的列,以便我们可以帮助您进行查询。@Shrey,您不能在变量中存储多个值,而可以使用“临时表”、“临时表变量”或“CTE”。。。还有一件事,您需要为哪一列查找平均订单日期?请提供样本数据和预期输出……使用
表变量
临时表
进行存储。使用表值参数或使用CTEWhat是您的最终要求。另外,你能不能请一些你需要的样本行和预期输出。数学方面的注意:要计算平均值,你需要加(而不是减)这些值,然后除以它们的计数。现在回到你的问题,在查询中计算平均值很容易,所以你不需要自己去做。告诉我们您试图计算其平均值的列,以便我们可以帮助您进行查询。@Shrey,您不能在变量中存储多个值,而可以使用“临时表”、“临时表变量”或“CTE”。。。还有一件事,您需要为哪一列查找平均订单日期?请提供样本数据和预期输出……使用
表变量
临时表
进行存储。因此,要计算平均值,我们至少需要两个日期。所以,我需要的是,得到最早和最晚的日期,得到它们之间的天数,除以行数(或订单数)。我建议你阅读这个问题很有帮助,但这是平均天数。换句话说,我需要获取SELECT语句返回的最高和最小日期之间的天数。因为我找到的是每个订单的平均天数,而不是平均日期。哦,天哪,为什么我一开始没有想到这个简单的答案呢。谢谢你,伙计。这很有帮助!:)所以要计算平均值,我们至少需要两个日期。所以,我需要的是,得到最早和最晚的日期,得到它们之间的天数,除以行数(或订单数)。我建议你阅读这个问题很有帮助,但这是平均天数。换句话说,我需要获取SELECT语句返回的最高和最小日期之间的天数。因为我找到的是每个订单的平均天数,而不是平均日期。哦,天哪,为什么我一开始没有想到这个简单的答案呢。谢谢你,伙计。这很有帮助!:)我需要存储SELECT语句返回的最早和最晚日期,并将其除以返回的行数。您的答案看起来很有说服力,但它仍然没有回答主要问题,从select语句中获取两个日期,以及它们之间的差异。这确实有助于@jwolf。谢谢:)我需要存储SELECT语句返回的最早和最晚日期,并将其除以返回的行数。您的答案看起来很有说服力,但它仍然没有回答主要问题,从select语句中获取两个日期,以及它们之间的差异。这确实有助于@jwolf。谢谢:)