如何计算同一个表的不同行组之间

时间:2013-02-21 12:55:33

标签: sql

有一张桌子:

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 $]我无法创建任何连接或大小写:(

7 个答案:

答案 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     

请参阅SQL Fiddle with Demo

答案 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

SQLFiddle

答案 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

在我个人看来,内联视图更好地使用然后加入,虽然你仍然会加入,但它仍然更易读,更容易调试......