2017-06-06 96 views
0

我有兩個表Table ATable B從兩個表中選擇

我想選擇每個Code之間的兩個月和年= 2017年之間的總和列作爲A,TableB作爲B,但是我希望從TableB中選擇所有行作爲C,其中Year = 2017,而不是月份的過濾器。

下面是我曾嘗試:

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 

但我得到不正確的結果。

+0

是'UNION'不是在這種情況下工作?您可以使用UNION通過添加額外列來區分TableName來進行查看。 – GauravKP

+0

是否與mois一樣?你需要一個union來組合兩個表中的所有行。 –

+0

mois as Month –

回答

0

我想我理解你的要求,如果我這樣做,他們其實很簡單。最初,您需要獲取YearCode組合的列表,以便您可以從它們中構建最終結果數據集,並將它們編錄到TableATableB中,並執行一些條件sum計算。

注意,我增加了一些額外的數據,以顯示我的方法的全部功能:

-- 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; 

輸出:

+------+------+------+------------+--------+---------+----------+------------+ 
| 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 | 
+------+------+------+------------+--------+---------+----------+------------+