Разделить колонку на 3 - PullRequest
0 голосов
/ 23 июня 2011

Примечание: попробовал пару ответов ниже (это в Teradata, поэтому некоторые ответы дают мне синтаксические ошибки везде)

Я попал в кирпичную стену здесь.Я хочу сравнивать год за годом в разных столбцах

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

Как разделить его по идентификатору и году?

В конце я бы хотел, чтобы это выглядело так

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

(сильно отредактировано для понимания)

Ответы [ 5 ]

1 голос
/ 23 июня 2011

как то так:

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
1 голос
/ 23 июня 2011

Лучшее, что я могу вам дать, учитывая количество предоставленных вами данных, - разбить вашу таблицу на подзапросы:

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

Более подробную информацию можно получить, если мы знаем, какой тип базы данных вы используетекакова реальная структура вашего стола и т. д., но, возможно, это поможет вам начать.

0 голосов
/ 24 июня 2011

Это выглядит как хороший кандидат на команду ROLLUP.Это даст вам автоматические суммы для сгруппированных столбцов:

GROUP BY ROLLUP (ID,Year)

Подробнее здесь.

0 голосов
/ 23 июня 2011

По вашим данным и желаемым выводам, я думаю, вы просто хотите это:

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

Обновление

Теперь, если ваш первый образец данных уже является запросом SELECT, вам необходимо:

select ID, Year, SUM(Revenue)
from (SELECT...) YourSelect
GROUP BY ID, Year
0 голосов
/ 23 июня 2011

Скорее всего, вам придется выполнить самостоятельное объединение

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
  • ProductName
  • Цена
  • Год

Вы можете сделать:

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 был первичным ключом или индексированным столбцом.Это также будет быстрее, чем использование вложенных выборок, которые намного медленнее, чем объединения (при объединении по индексу).

...