2013-05-08 6 views
0

J'ai deux instructions select. 1er select renvoie les données de l'année précédente 2012, tandis que 2nd select affiche l'année en cours. Comment vais-je rejoindre ces deux pour obtenir ma sortie désirée.Joindre deux instruction select en sql

select a.id, b.item, a.sum(qty) as 'yr1qty', a.yr1amt from table A 
left join table B on a.code = b.code 
where date between '04/01/2012' and '04/07/2012' 
group by a.id, b. item 

select a.id, b.item, a.sum(qty) as 'yr2qty', a.yr2amt from table A 
left join table B on a.code = b.code 
where date between '04/01/2013' and '04/07/2013' 
group by a.id, b. item 

sortie désirée:

id item  yr1qty y1amt  yr2qty yr2amt 

01 item01  20  2000.00  5  500.00 
02 item02       8  400.00 
03 item03  10  1250.00 
04 item04  3  60.00  2  40.00 
05 item05       8  400.00 
+1

est-ce vraiment un.y1amt ou est-ce sum (a.qty) que yr1amt? –

Répondre

1

Vous devriez être en mesure de rejoindre les deux comme sous-requêtes en utilisant une jointure externe complète

select 
    coalesce(a.id,b.id), 
    coalesce(a.item,b.item), 
    yr1qty, 
    yr1amt, 
    yr2qty, 
    yr2amt 
from 
    (
    select a.id, b.item, a.sum(qty) as 'yr1qty', a.yr1amt from table A 
    left join table B on a.code = b.code 
    where date between '04/01/2012' and '04/07/2012' 
    group by a.id, b. item) as a 
    full outer join 
    (
    select a.id, b.item, a.sum(qty) as 'yr2qty', a.yr2amt from table A 
    left join table B on a.code = b.code 
    where date between '04/01/2013' and '04/07/2013' 
    group by a.id, b. item 
    ) as b on a.id = b.id 
+0

Merci beaucoup pour votre aide. Je l'ai compris. J'ai votre suggestion Robb mais changez pour la jointure gauche au lieu de la jointure externe complète. Godbless tous – user1840952

0

Avez-vous besoin de deux? Voici le résultat en une requête ...

select a.id, b.item, 
a.sum(
    CASE WHEN date between '04/01/2012' and '04/07/2012' 
     THEN qty 
     ELSE 0 
    END) AS 'yr1qty', a.yr1amt, 
a.sum(
    CASE WHEN date between '04/01/2013' and '04/07/2013' 
     THEN qty 
     ELSE 0 
    END) AS 'yr2qty', a.yr2amt 
from table A 
left join table B on a.code = b.code 
group by a.id, b.item 
0

Aviez-vous besoin d'utiliser un pivot?

select id,item, yr1qty,yr1amt, yr2qty, yr2amt from 
(
select a.id, b.item, a.qty, a.amt, 
    case 
     when [date] between '2012-01-04' and '2012-07-01' then 'yr1qty' 
     when [date] between '2013-01-04' and '2013-07-01' then 'yr2qty' 
     else 'oor' 
    end as yrqty, 
    case 
     when [date] between '2012-01-04' and '2012-07-01' then 'yr1amt' 
     when [date] between '2013-01-04' and '2013-07-01' then 'yr2amt' 
     else 'oor' 
    end as yramt 



from A 
left join B on a.code = b.code 
) x 
pivot (
    sum(qty) for yrqty in ([yr1qty],[yr2qty]) 
) qtyTotal 
pivot (
    sum(amt) for yramt in ([yr1amt],[yr2amt]) 
) amtTotal 
+0

Merci Monsieur pour votre suggestion, je suis content avec les idées de M.Robb. Merci quand même :) – user1840952