2010-06-14 6 views
3

J'ai tableau similaire à ce qui suit:Comparaison côte à côte des données par année dans SQL

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

Je voudrais une requête qui renverrait la comparaison suivante

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

Quels sont les options pour le faire? Peut-il être fait sans jointures?

Je travaille avec DB2, mais des réponses dans tous les types SQL seraient utiles.

+2

En ce qui concerne la partie générale de votre question dans d'autres il y a un DBMS mot-clé 'PIVOT' –

Répondre

8
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

Une requête onglet simple croix doit le faire

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 

Vérifiez la syntaxe, mais c'est l'idée de base. Il n'y a vraiment pas besoin de se joindre.

3

Vous avez déjà des réponses qui n'utilisent pas une jointure, mais juste pour la comparaison est ici une alternative qui n'utilise une jointure:

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 

Je travaille avec DB2 , mais des réponses dans tous les types SQL seraient utiles.

est ici une solution à l'aide PIVOT qui prend en charge SQL Server:

SELECT 
    Product, 
    [2006] AS [2006 Value], 
    [2007] AS [2007 Value] 
FROM Table1 
PIVOT(MAX(Value) FOR Year IN ([2006], [2007])) 
AS p; 
Questions connexes