有一张桌子:
Year Month Value
2011 1 500
2011 2 550
2011 3 600
...
...
2012 1 600
2012 2 750
2012 3 930
有没有办法可以计算出同月/不同年份的价值之间的差异,以便得到一个结果:
Month Value
1 100
2 200
3 330
...
我尝试过这样的事情:
select month, a.value-b.value
from
(select month, value from table where year = 2012) a,
(select month, value from table where year = 2011) b
但输出为12个月(选择(2012)* 12个月的选择b(2011)..
编辑:抱歉缺少重要信息:
正在通过odbc:jdbc bridge对excel表进行查询。
因为“from”子句总是这样:[sheet1 $]我无法创建任何连接或大小写:(
答案 0 :(得分:3)
你非常接近如何获得结果。我建议使用类似于将数据数据到列中的内容,然后你可以在每年之间采取差异:
select month,
Year2012-Year2011 as Diff
from
(
select month,
sum(case when year = 2011 then value end) Year2011,
sum(case when year = 2012 then value end) Year2012
from yourtable
group by month
) src
答案 1 :(得分:1)
您的查询不起作用,因为您在表上执行了CROSS JOIN
(因为,
),因此每一行都与另一个表中的每一行匹配,而不是{ {1}}这个月。
修改您的查询:
INNER JOIN
更快的查询:
select a.month, a.value-b.value
from
(select month, value from table where year = 2012) a
JOIN
(select month, value from table where year = 2011) b
ON a.month = b.month
每年每月多行:
select a.month, a.value-b.value
from
yourTable a
join yourTable b
on a.month = b.month
where a.year = 2012 and b.year = 2011
答案 2 :(得分:1)
这样的东西?假设year
/ month
是唯一的。
SELECT
a.month,
a.value - b.value
FROM
tablename a
INNER JOIN tablename b
ON a.year - 1 = b.year
AND a.month = b.month
答案 3 :(得分:1)
只需在查询中添加where
子句..
select month, a.value-b.value
from
(select month, value from table where year = 2012) a,
(select month, value from table where year = 2011) b
where a.month = b.month
您正在做的是交叉连接,将第一个表中的每一行与第二列的每一行组合在一起,将过滤掉与不同月份号匹配的行。
答案 4 :(得分:0)
你想做一个自我加入。一般的想法是从同一个表中选择两次,但使用不同的别名。
select t1.something, t2.something
from yourtable t1 join yourtable t2 on something
etc
答案 5 :(得分:0)
选择a.month,(a.value-(从@tablename b中选择b.value,其中b.year = @ year2和b.month = a.month))作为diff 来自@tablename a 其中a.year = @ year1
我认为它会对你有所帮助。实际上,因为我们知道我们只能在减法中使用两个数字,所以我在这里使用了year1和year.2。把你的表名放在适当的地方
答案 6 :(得分:0)
此外,如果您的示例中每月只有2个值,并且您的SQL版本中提供了分析函数,那么这将起作用。你可以用不同的方式对它进行分区......:
SELECT distinct month, (l_val - f_val) value
FROM
(
SELECT year, month, month_val
, FIRST_VALUE(month_val) OVER (PARTITION BY month ORDER BY month) f_val
, LAST_VALUE(month_val) OVER (PARTITION BY month ORDER BY month) l_val
FROM your_table
)
ORDER BY 1
/
MONTH VALUE
----------------
1 100
2 200
3 330
在我个人看来,内联视图更好地使用然后加入,虽然你仍然会加入,但它仍然更易读,更容易调试......