2011-08-19 5 views
0

J'ai une requête SQL que je n'arrive pas à afficher comme je le souhaite. Fondamentalement, nous avons une table pleine de transactions et j'aimerais obtenir une somme (d'un type particulier de transaction) achetée à partir de février de cette année jusqu'à maintenant. Voici la requête pour que:Affichage des résultats de la requête SELECT - à partir de la même table - côte à côte

select sum(amount) as "2011" from transactions 
where transaction_type = 'registration' 
and date_entered > '2011-02-01' 
and date_entered < GetDate() 

Maintenant, je voudrais aussi voir une somme de ces mêmes opérations, mais pour l'année précédente:

select sum(amount) as "2010" from transactions 
where transaction_type = 'registration' 
and date_entered > '2010-02-01' 
and date_entered < DateAdd(yy, -1, GetDate()) 

Ce que je ne peux pas à comprendre est comment obtenir ces sommes côte à côte. J'ai essayé UNION all mais ceux-ci s'affichent dans des lignes séparées, pas des colonnes.

select sum(amount) as "2011" from transactions 
where transaction_type = 'registration' 
and date_entered > '2011-02-01' 
and date_entered < GetDate() 
UNION all 
select sum(amount) as "2010" from transactions 
where transaction_type = 'registration' 
and date_entered > '2010-02-01' 
and date_entered < DateAdd(yy, -1, GetDate()) 

J'ai aussi lu ici sur Stack Overflow que PIVOT pourrait être une option, mais je n'ai pas encore voir un exemple que je pouvais manipuler/modifier pour les requêtes ci-dessus.

Des suggestions pour savoir comment obtenir ces données côte-à-côte? Je suis sûr que je néglige quelque chose de simple.

Merci beaucoup!

+0

Êtes-vous que jamais à comparer l'année en cours à la précédente ou y at-il des variables dans cette équation? Si aucune autre variable, alors je ne vois pas pourquoi vous aurez besoin d'utiliser PIVOT, l'exemple de Bohemian suffira parfaitement. – deutschZuid

Répondre

0

La solution rapide et UGLY est la suivante:

SELECT (
select sum(amount) as "2011" from transactions 
where transaction_type = 'registration' 
and date_entered > '2011-02-01' 
and date_entered < GetDate()) as '2011', 
(select sum(amount) as "2010" from transactions 
where transaction_type = 'registration' 
and date_entered > '2010-02-01' 
and date_entered < DateAdd(yy, -1, GetDate())) as '2010' 

Vous pouvez l'utiliser pour une requête unique, mais est certainement quelque chose que je veux ajouter à un système de production.

Pour un bon exemple PIVOT vérifier celui-ci: http://rajaramtechtalk.wordpress.com/2008/05/13/how-to-use-pivot-in-sql-2005/

Votre problème est que vous commencez à partir de Février, donc en utilisant l'année DATEPART ne fonctionnera pas pour vous et vous pouvez avoir à utiliser mois et les faire un peu de travail avec Les resultats.

1

Vous voulez un "pivot", qui est essentiellement un calcul de la forme sum(test * amount).
Voici comment faire un pivot dans votre cas:

select 
    sum(case when date_entered between '2011-02-01' and < GetDate() then amount else 0 end) as "2011", 
    sum(case when date_entered between '2010-02-01' and DateAdd(yy, -1, GetDate() then amount else 0 end) as "2010" 
from transactions 
where transaction_type = 'registration'; 
Questions connexes