Параллельное сравнение данных по годам в SQL - PullRequest
3 голосов
/ 15 июня 2010

У меня есть таблица, подобная следующей:

Year | Product |  Value
2006   A          10
2006   B          20
2006   C          30
2007   A          40
2007   B          50
2007   C          60

Я бы хотел запрос, который вернул бы следующее сравнение

Product | 2006 Value | 2007 Value
A         10           40
B         20           50
C         30           60

Какие есть варианты сделать это? Можно ли это сделать без объединений?

Я работаю с DB2, но ответы на все типы SQL были бы полезны.

Ответы [ 3 ]

8 голосов
/ 15 июня 2010
select Product, 
    max(case when Year = 2006 then Value end) as [2006 Value], 
    max(case when Year = 2007 then Value end) as [2007 Value] 
from MyTable
group by Product
order by Product
3 голосов
/ 15 июня 2010

У вас уже есть ответы, которые не используют объединение, но для сравнения приведу альтернативу, которая использует объединение:

SELECT
    T1.Product,
    T1.Value AS [2006 Value],
    T2.Value AS [2007 Value]
FROM Table1 T1
JOIN Table1 T2
ON T1.Product = T2.Product
AND T1.Year = 2006
AND T2.Year = 2007

Я работаю с DB2, но ответы на все типы SQL были бы полезны.

Вот решение, использующее PIVOT, которое поддерживает SQL Server:

SELECT
    Product,
    [2006] AS [2006 Value],
    [2007] AS [2007 Value]
FROM Table1
PIVOT(MAX(Value) FOR Year IN ([2006], [2007]))
AS p;
3 голосов
/ 15 июня 2010

Простой запрос кросс-таблицы должен сделать это

SELECT DISTINCT (year), PRODUCT,
sum (case when year = 2006 then VALUE else 0 end ) as [2006 Value]
sum (case when year = 2007 then value else 0 end ) as [2007 value]
from table
group by year, product

Проверьте синтаксис, но это основная идея. Там действительно нет необходимости присоединяться.

...