使用另一个查询中一列的所有值

时间:2018-05-17 14:00:23

标签: sql-server loops tsql dynamic-variables

我正在尝试为sql-server中的以下问题找到解决方案:

我有一个表 t1 ,其中我想为每个代理商使用每个日期,并通过查询循环查找avg_rate。这是我的表t1:

表T1:

+--------+-------------+
| agency |  end_date   |
+--------+-------------+
|      1 | 2017-10-01  |
|      2 | 2018-01-01  |
|      3 | 2018-05-01  |
|      4 | 2012-01-01  |
|      5 | 2018-04-01  |
|      6 | 2017-12-01l |
+--------+-------------+

我真的想要使用end_date列中的所有值并将其插入到查询中(我用** **标记):

    with averages as (
select      a.id as agency
            ,c.rate  
            , avg(c.rate) over (partition by a.id  order by a.id )  as avg_cost


from table_a as a
                     join  rates c on a.rate_id = c.id


and c.end_date =  **here I use all values from t1.end_date** 
and c.Start_date =  **here I use all values from above minus half a year** = dateadd(month,-6,end_date)

group by    a.id 
            ,c.rate  
            )
select distinct agency, avg_cost  from averages 
order by 1 

我需要两个动态日期的原因是,如果您更改这些日期之间的时间范围,avg_rates会有所不同。

我的问题和我的问题现在是:

如何从表t1中取出end_date将其插入到c.end_date所在的查询中,如果通过t1.end_date中的所有值,则循环?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

你真的需要平均窗口吗?试试这个。

;with timeRanges AS
(
    SELECT
        T.end_date,
        start_date = dateadd(month,-6, T.end_date)
    FROM
        T1 AS T
)
select      
    a.id as agency,
    c.rate,
    T.end_date,
    T.start_date,
    avg_cost = avg(c.rate)
from 
    table_a as a
    join  rates c on a.rate_id = c.id
    join timeRanges AS T ON A.DateColumn BETWEEN T.start_date AND T.end_date
group by   
    a.id ,
    c.rate,
    T.end_date,
    T.start_date

您需要一个日期列来将您的数据与T1(我在此示例中称为DateColumn)相关联,否则所有时间范围都会返回相同的平均值。

答案 1 :(得分:0)

我可以想到几种方法 - 光标 StoredProcedure 加入 ...... 鉴于查询的简单性,表T1 笛卡尔产品交叉加入)与平均值 CTE应该相对应做魔术。