如何在SQL中将变量的值设置为查询结果?

时间:2016-02-03 17:06:37

标签: sql sql-server stored-procedures

我有一个包含两个变量的存储过程。它们是@DateLeft@DateRight@DateLeft是我想要设置的变量,等于查询结果。@DateRight = GETDATE()。我有以下数据:

编辑2:添加了“距离”列

Date         Code    Distance       **The values in the distance column are arbitrary and they are there for example's sake
11/23/2015   A       456
12/28/2015   B       2163
1/25/2016    C       203
4/30/2015    D       8921

我的存储过程应该使用@DateLeft@DateRight来确定控制其他计算的日期范围。这些日期是特定事件发生的最近日期。我应该使用Date列中的日期作为@DateLeft列中每个不同代码的Code值。例如,该过程应该运行并获取11/23/2015作为代码@DateLeft的{​​{1}}的值。然后,它将进行计算并继续前进,并为代码A获取12/28/2015,依此类推。我不知道如何执行此计算,因此它不必再次运行整个过程来使用B的不同日期进行计算。我对最终结果的查询看起来像这样:

@DateLeft

我想做这样的事情(我当然愿意接受建议):

SELECT SUM(TraveledDistance) AS Distance, Code 
FROM MyTable
WHERE 
Time BETWEEN @DateLeft AND @DateRight

感谢任何帮助。

编辑:程序说明本身

该过程采用SET @DateLeft = Select Date From SampleTable Group By Code --I know this doesn't work 值(当前,一个参数)并将其用作过滤器来计算该日期与今天日期之间的距离( @DateLeft)。如果需要,您可以组成计算部分。我更关心的是我应该采用的方法将@DateRight设置为每个代码的每个不同日期,而不必多次重复该过程。

4 个答案:

答案 0 :(得分:1)

df1[-1] <- df1[-1]/df1[df1$v1=='ABC', -1][col(df1[-1])]

您可以使用此语法设置变量值。

根据OP的更新进行更新:

OP的更新请求并不是很清楚,但我相信一个循环可以解决这个问题。

DECLARE @DateLeft DATE;
SELECT @DateLeft = [Date] From SampleTable Group By Code

答案 1 :(得分:0)

如果你需要像循环那样做,你可能需要查看SQL Server Cursor。

如果您不需要循环,您可以随时为变量选择值:

declare @DateLeft as datetime;
SELECT @DateLeft =  Date 
From SampleTable
Group By Code;

答案 2 :(得分:0)

也许这就是你要找的东西?:

select
    (
        /* calculation goes here */
        select sum(m.TraveledDistance) as Distance
        from MyTable m
        /* correlate the subquery on t.Code and max t.Date */
        where m.Code = t.Code and m.Time between max(t.Date) and getdate() 
    ) as Calculation,
    t.Code
from SampleTable t
group by t.Code

答案 3 :(得分:-2)

您的方法如下:SET @DateLeft =(按代码从样本表组中选择日期)