我对SQL很新,所以如果这是一个菜鸟问题,请原谅我。我正在构建一个存储过程,该存储过程从具有按月存储的数据的表中进行查询。以下是表格的简化示例:
+------------+------------+------------+
| date | value_A | value_B |
+------------+------------+------------+
| 2014-01-01 | 100 | 200 |
| 2014-02-01 | 200 | 400 |
| 2014-03-01 | 300 | 600 |
| 2014-04-01 | 400 | 800 |
| 2014-05-01 | 500 | 1000 |
| 2014-06-01 | 600 | 1200 |
| 2014-07-01 | 700 | 1400 |
| ... | ... | ... |
+------------+------------+------------+
在程序中,我需要计算:(Value_A / Value_B
)。但是,Value_B需要落后一个月。因此,在上面的示例中,2014年2月的计算将是:(Value_A of Feb 2014 / Value_B or Jan 2014
)或(200 / 200
)。然后,2014年3月的计算为:(Value_A of Mar 2014 / Value_B of Feb 2014
)或(300 / 400
),依此类推。希望这是有道理的。
如果我只查询特定的月份,那就不会太难了,因为我可以在程序中使用CASE
语句。但由于我需要按月分组检索一年的数据,我有点难过。
如果没有Value_B的一个月滞后,我将SQL语句设置为:
SELECT ex.`date `, ex.value_A / ex.value_B AS calc
FROM example_table ex
WHERE ex.`date` BETWEEN '2014-03-01' AND '2015-02-01'
GROUP BY ex.`date`
我不知道从哪里开始。我已尝试过不同的联盟和工会,但没有任何运气。我是否需要使用自己的日期范围分别查询Value_A和Value_B,然后以某种方式将它们合并在一起进行计算?或者我是否比现在更加努力?
感谢您的帮助。
答案 0 :(得分:1)
SELECT t.date, t.value_A/t2.value_B AS calc
FROM table t JOIN table t2 ON t.date = DATE_ADD(t2.date, INTERVAL 1 MONTH)
答案 1 :(得分:0)
我希望这有助于我认为我正确地阅读了你的问题......
SELECT ex.`date`, ex.value_A / ex2.value_B as calc
FROM test ex
LEFT JOIN test ex2
ON DATE_ADD(ex.`date`, INTERVAL 1 MONTH) = ex2.`date`
WHERE ex.`date` BETWEEN '2014-03-01' AND '2015-02-01'
GROUP BY ex.`date`