从另一个视图创建视图并计算某些字段

时间:2019-07-15 13:47:10

标签: sql sql-server database

我有两个表(Daily_logSix_months_Log),第一个表(Daily_log)包含每日数据记录,第二个表(Six_months_Log)包含六个月期间的数据,前六个月以1显示,后六个月以2显示。 但是,它们都是相同的,但是对于[Six_months_Log]表中的每个记录,我们在[Daily_log]表中有很多记录。因此,我想为[Daily_log]表中的每个并行记录计算[Six_months_Log]表中每六个月的记录平均值,最后 [Daily_log].[Value]的平均值乘以其他表的[Six_months_Log].[Value]

  

表的每一行:[Daily_log].[Value] x [Six_months_Log].[Value]

Daily_log中,我们有:

[Code_Type]: 602 是每日代码

[Half]: 1是一年的前六个月,2是一年的后六个月

[Location]:每个地方都有唯一代码

=============================| Daily_log |==========================
+-------+-----------+------------+---------+-------+--------+------+
| ID    | Location  |    Date    |Code_Type|  Year | Value  | Half |
+-------+-----------+------------+---------+-------+--------+------+
| 1200  |  20200    |2015/01/01  | 602     | 2015  | 550    |  1   |
| 1202  |  20200    |2015/01/02  | 602     | 2015  | 680    |  1   |
| 1203  |  20200    |2015/01/03  | 602     | 2015  | 780    |  1   |
| ...   |...        |...         | ...     | ...   | ...    | ...  |
| 1420  |  20200    |2015/06/01  | 602     | 2015  | 260    |  2   |
| 1421  |  20200    |2015/06/02  | 602     | 2015  | 790    |  2   |
| 1422  |  20200    |2015/06/03  | 602     | 2015  | 640    |  2   |
| ...   |...        |...         | ...     | ...   | ...    | ...  |
| 1420  |  15300    |2017/11/01  | 602     | 2017  | 470    |  2   |
| 1421  |  15300    |2017/11/02  | 602     | 2017  | 990    |  2   |
| 1422  |  15300    |2017/11/03  | 602     | 2017  | 140    |  2   |
| ...   |...        |...         | ...     | ...   | ...    | ...  |
+-------+-----------+------------+---------+-------+--------+------+

Six_months_Log中,我们有:

[Code_Type]: 402 是6个月的代码

[Half]: 1是一年的前六个月,2是一年的后六个月

[Location]:每个地方都有唯一代码

========================| Six_months_Log |==========================
+-------+-----------+------------+---------+-------+--------+------+
| ID    | Location  |    Date    |Code_Type|  Year | Value  | Half |
+-------+-----------+------------+---------+-------+--------+------+
| 201   |  20200    |2015/01/01  | 402     | 2015  | 50     |  1   |
| 202   |  20200    |2015/07/01  | 402     | 2015  | 80     |  2   |
| ...   |...        |...         | ...     | ...   | ...    | ...  |
| 320   |  20201    |2015/01/01  | 402     | 2015  | 60     |  1   |
| 321   |  20201    |2015/07/01  | 402     | 2015  | 90     |  2   |
| ...   |...        |...         | ...     | ...   | ...    | ...  |
| 820   |  15300    |2017/01/01  | 402     | 2017  | 70     |  1   |
| 821   |  15300    |2017/07/01  | 402     | 2017  | 20     |  2   |
| ...   |...        |...         | ...     | ...   | ...    | ...  |
+-------+-----------+------------+---------+-------+--------+------+

1 个答案:

答案 0 :(得分:2)

您是否正在寻找类似的东西?

select sml.*, dl.avg_value, dl.avg_value * sml.value
from six_months_log sml outer apply
     (select avg(dl.value) as avg_value
      from daily_log dl
      where dl.location = sml.location and
            dl.date <= sml.date and
            dl.date > dateadd(month, -6, sml.date)
     ) dl;

为了提高性能,您希望在daily_log(location, date, value)上建立索引。

相关问题