我在一张表中有两个不同年份的数字(如下所示)。
如何编写SELECT
查询来计算2014年至2013年间的价值差异。
Table 1 sample information:
year value
--------------------
2013 100
2014 150
答案 0 :(得分:3)
诀窍是要意识到你需要将表加入到自身中,以便你可以在可以告诉你两年不同年份的行上进行操作。例如:
SELECT t1.value-t2.value as difference
FROM yourtable AS t1
INNER JOIN yourtable AS t2
ON(t1.year=2013 AND t2.year=2014)
答案 1 :(得分:2)
SELECT (a.value-b.value) as difference from table as a
INNER JOIN table as b
on a.year=2014 and b.year =2015
答案 2 :(得分:1)
您应该了解关系数据库的第一件事是表中的任何记录在语义上等同于其他记录。我的意思是:你的表中可能有两条记录(2013年和2014年)......或者你可能有一百条记录。因此,您应该根据带有不确定数量记录的表来考虑您的查询。
例如:一个计算任何记录与前一个记录之间差异的查询:
一步一步:
所有记录的列表:
SELECT year, value FROM table
年份记录之间的联接:
SELECT a.year, a.value, b.year, b.value
FROM table AS a INNER JOIN table AS b ON a.year=b.year
前一年的记录之间的联接:
SELECT a.year, a.value, b.year, b.value
FROM table AS a INNER JOIN table AS b ON a.year=1+b.year
最后,一年与上一次之间的差异:
SELECT a.year, a.value, b.year, b.value, a.value-b.value
FROM table AS a INNER JOIN table AS b ON a.year=1+b.year
答案 3 :(得分:1)
一般解决方案。假设像这样的表(以year_val
为例):
mysql> select * from year_val;
+------+------+
| year | val |
+------+------+
| 2015 | 100 |
| 2014 | 120 |
| 2013 | 500 |
| 2012 | 400 |
+------+------+
4 rows in set (0.01 sec)
QUERY
SELECT yv1.year AS current_year
,yv2.year AS last_year
,yv1.val AS current_val
,yv2.val AS last_val
,yv2.val - yv1.val AS difference
FROM year_val yv1
INNER JOIN year_val yv2
ON yv1.year = yv2.year + 1;
<强>输出强>
+--------------+-----------+-------------+----------+------------+
| current_year | last_year | current_val | last_val | difference |
+--------------+-----------+-------------+----------+------------+
| 2015 | 2014 | 100 | 120 | 20 |
| 2014 | 2013 | 120 | 500 | 380 |
| 2013 | 2012 | 500 | 400 | -100 |
+--------------+-----------+-------------+----------+------------+
答案 4 :(得分:0)
我没有一个SQL服务器可以尝试这个,但我会使用子查询,比如::
{{1}}
答案 5 :(得分:0)
不喜欢太多因为非常具体。但这是一种没有join
使用条件SUM
SELECT SUM(CASE
WHEN year = 2014 THEN value
ELSE -value
END) as total
FROM Table1
答案 6 :(得分:0)
根据Juan的回答,这是解决这个问题的更“企业”方式
SELECT a.value - b.value as difference from (select year, value from table = 2014) as a
INNER JOIN (select year, value from table where year = 2015) as b
on a.year = 2015 and b.year = 2014
WHERE a.year = 2015 and b.year = 2014