2017-06-06 16 views
0

Ich habe zwei Tabellen Table A und Table B.Wählen Sie aus zwei Tabellen

Ich möchte die Summenspalten jeder Code zwischen zwei Monaten und Jahren = 2017 für TableA als A und TableB als B auswählen, aber ich möchte alle Zeile aus TableB als C auswählen, wobei Jahr = 2017 ohne Filter des Monats.

unter dem, was ich versucht habe:

enter image description here

SELECT A.Annee as Year, 
     code_ville as Code, 
     SUM(UniteVendu) AS Unit, 
     SUM(CAVendu) AS CA, 
     SUM(B.UniteVentePrev) AS Unit_P, 
     SUM(B.CAVentePrev) AS Ca_P, 
     SUM(C.UniteVentePrev) AS Unit_PPP, 
     SUM(C.CAVentePrev) AS Ca_PPP 
FROM TableA A 
    left join TableB B on A.code=B.codeP 
        and A.Annee=PP.Annee 
        and A.mois =B.mois  
    left join TableB C on A.code=C.codeP 
        and A.Annee=C.Annee 
where A.Annee = 2017 
and A.mois >= 1 
and A.mois <= 3 
GROUP BY R.Annee, 
      code_ville 

Aber ich habe die falschen Ergebnisse.

+0

Ist 'UNION' in diesem Fall nicht funktioniert? Sie können UNION zum Anzeigen verwenden, indem Sie eine zusätzliche Spalte hinzufügen, um den TableName zu unterscheiden. – GauravKP

+0

Ist der Monat derselbe wie Mois? Sie benötigen eine Union all, um alle Zeilen aus beiden Tabellen zu kombinieren. –

+0

Ja mois als Monat –

Antwort

0

Ich denke, ich verstehe Ihre Anforderungen hier und wenn ich das tue, sind sie eigentlich ziemlich einfach. Zunächst müssen Sie Ihre Liste der und Code Kombinationen erhalten, so dass Sie einen endgültigen Ergebnisdatensatz von ihnen erstellen können, join in Ihre TableA und TableB und einige bedingte sum Berechnungen durchführen.

Bitte beachte, dass ich einige zusätzliche Daten hinzugefügt haben, um die volle Funktionalität meines Ansatzes anzuzeigen:

-- Built test data 
declare @a table([Year] int,[Month] int,Code int, Unit int, CA decimal(20,2)); 
declare @b table([Year] int,[Month] int,CodeP int, Unit_P int, CA_P decimal(20,0)); 
insert into @a values (2017,1,280,1,298259.42),(2017,1,281,0,0),(2017,2,280,1,298220.99),(2017,2,281,0,0),(2017,3,282,0,0),(2017,3,280,1,298033.09),(2017,4,280,1,298000.00); 
insert into @b values (2017,1,280,1,250000),(2017,1,280,3,950000),(2017,3,281,1,250000),(2017,3,282,1,250000),(2017,6,282,1,250000); 

-- Derived table to get all combinations of Year and Code across both tables 
with y as 
(
    select [Year] 
      ,Code 
    from @a 
    union -- Use of UNION ensures that a unique list is returned. 
    select [Year] 
      ,CodeP 
    from @b 
) 
select y.[Year] 
     ,y.Code 
     ,sum(case when a.[Month] between 1 and 3 then a.Unit else 0 end) as Unit 
     ,sum(case when a.[Month] between 1 and 3 then a.CA else 0 end) as CA 
     ,sum(case when b.[Month] between 1 and 3 then b.Unit_P else 0 end) as Unit_P 
     ,sum(case when b.[Month] between 1 and 3 then b.CA_P else 0 end) as CA_P 
     ,isnull(sum(a.Unit),0) as Unit_PPP 
     ,isnull(sum(a.CA),0) as CA_PPP 
from y -- Then join this list onto both tables to get the totals 
    left join @a a 
     on(y.[Year] = a.[Year] 
      and y.Code = a.Code 
      ) 
    left join @b b 
     on(y.[Year] = b.[Year] 
      and y.Code = b.CodeP 
      ) 
group by y.[Year] 
     ,y.Code 
order by y.[Year] 
     ,y.Code; 

Ausgang:

+------+------+------+------------+--------+---------+----------+------------+ 
| Year | Code | Unit |  CA  | Unit_P | CA_P | Unit_PPP | CA_PPP | 
+------+------+------+------------+--------+---------+----------+------------+ 
| 2017 | 280 | 6 | 1789027.00 |  16 | 4800000 |  8 | 2385027.00 | 
| 2017 | 281 | 0 |  0.00 |  2 | 500000 |  0 |  0.00 | 
| 2017 | 282 | 0 |  0.00 |  1 | 250000 |  0 |  0.00 | 
+------+------+------+------------+--------+---------+----------+------------+ 
Verwandte Themen