0

注意:尝试了以下几个答案(它在 Teradata 中,所以一些答案到处都给我语法错误)

我在这里撞到了一堵砖墙。我想在不同的列中逐年比较

ID, Year, Revenue 
1, 2009, 10 
1, 2009, 20 
1, 2010, 20 
2, 2009, 5 
2, 2010, 50
2, 2010, 1

如何按 ID 和年份分开它?

最后我希望它看起来像这样

ID, Year, Sum
1, 2009, 30
1, 2009, 20
...
2, 2010, 51

(为理解而进行了大量编辑)

4

5 回答 5

1

根据您提供的详细信息,我能给您的最好的方法是将您的表分解为子查询:

select t1.yr - t2.yr from 
 (select yr 
   from the_table where yr = 2010) t1, 
 (select yr 
   from the_table where yr = 2010) t2

如果我们知道您使用的是哪种类型的数据库、表的实际结构是什么等,可以提供更多详细信息,但也许这会让您入门。

于 2011-06-23T19:35:55.753 回答
1

像这样的东西:

select id, t2009.year, t.2010.year, t2010.year-t.2009.year diff
from
( select id, year
from mytable
where year = 2009
) t2009
,
( select id, year
from mytable
where year = 2010
) t2010
于 2011-06-23T19:36:26.893 回答
0

这看起来很适合 ROLLUP 命令。它将为您提供分组列的自动总和:

GROUP BY ROLLUP (ID,Year)

更多信息在这里。

于 2011-06-23T20:18:23.110 回答
0

您很可能必须进行自我加入

SELECT [what you are comparing] FROM [table] t1
  [INNER/LEFT] JOIN [table] t2 ON t1.[someID] = t2.[someID]
WHERE t1.year = 2009 AND t2.year = 2010

在 someID 中不一定必须是 ID,甚至是索引列,但它应该是您要在这些年中比较的列。

例如,一个名为“产品”的表,其中包含列/字段

  • ID
  • 产品名称
  • 价格

你可以这样做:

SELECT t1.ProductName, (t2.Price - t1.Price) As Price_change FROM Products t1
  INNER JOIN Products t2 ON t1.ProductName = t2.ProductName
WHERE t1.year = 2009 AND t2.year = 2010

如果 ProductName 是主键或索引列,这会更快。这也比使用比连接慢得多的嵌套选择(在索引上连接时)要快得多。

于 2011-06-23T19:42:23.400 回答
0

根据您的数据和所需的输出,我认为您只是想要这个:

select ID, Year, SUM(Revenue)
from YourTable
GROUP BY ID, Year

更新

现在,如果您的第一个数据样本已经是一个SELECT查询,您需要:

select ID, Year, SUM(Revenue)
from (SELECT...) YourSelect
GROUP BY ID, Year
于 2011-06-23T19:42:50.857 回答