2017-05-14 151 views
1

我在我的語法中有一個小問題,請幫助我。從兩個表中選擇總和

Table TransM 
Code_Project Code_Name Code_Stat Project_Name 
17-0004  A   1   ABC 
17-0004  A   2   ABC 
17-0004  B   1   DEF 

Tabel TransW 
Code_Project  Code_Name  Total 
17-0004   A    1000 
17-0004   A    1500 
17-0004   A    1200 
17-0004   B    1600 

我要的結果是這樣的:

Code_Project Code_Name Project_Name GrandTotal 
17-0004  A   ABC   3700 
17-0004  B   DEF   1600 

我用這個語法和grandtotal是錯誤的

SELECT 
    a.Code_Project, 
    a.Code_Name, 
    a.Project_Name, 
    SUM(b.Total) AS GrandTotal 
FROM 
    TransM a 
    INNER JOIN TransW b 
    ON a.Code_Project = b.Code_Project 
    AND a.Code_Name = b.Code_Name 
WHERE a.Code_Project = '17-0004' 
GROUP BY a.Code_Project, 
    a.Code_Name, 
    a.Project_Name 

請告訴我正確的語法,感謝

回答

1

您在TransM中有多行匹配TransW中的多行,因爲th在TransM中並不是唯一的。

你可以得到distinct集作爲一個子查詢/派生表和使用像這樣加入:

select 
    a.Code_Project 
    , a.Code_Name 
    , a.Project_Name 
    , sum(b.Total) as GrandTotal 
from (select distinct Code_Project, Code_Name, Project_Name from TransM) a 
    inner join TransW b 
    on a.Code_Project = b.Code_Project 
    and a.Code_Name = b.Code_Name 
where a.Code_Project = '17-0004' 
group by 
    a.Code_Project 
    , a.Code_Name 
    , a.Project_Name 

如果有多個不同的值Project_Name對於一個給定Code_Project, Code_Name,那麼你仍然會得到重複。在這種情況下,你需要決定究竟選擇哪Project_Name返回,或使用min()max()只是挑一個像這樣:

select 
    a.Code_Project 
    , a.Code_Name 
    , a.Project_Name 
    , sum(b.Total) as GrandTotal 
from (
    select m.Code_Project, m.Code_Name, max(m.Project_Name) as Project_Name 
    from TransM m 
    group by m.Code_Project, m.Code_Name 
    ) a 
    inner join TransW b 
    on a.Code_Project = b.Code_Project 
    and a.Code_Name = b.Code_Name 
where a.Code_Project = '17-0004' 
group by 
    a.Code_Project 
    , a.Code_Name 
    , a.Project_Name 

rextester演示:http://rextester.com/RRGFQM14769

回報:

+--------------+-----------+--------------+------------+ 
| Code_Project | Code_Name | Project_Name | GrandTotal | 
+--------------+-----------+--------------+------------+ 
| 17-0004  | A   | ABC   |  3700 | 
| 17-0004  | B   | DEF   |  1600 | 
+--------------+-----------+--------------+------------+ 
+0

感謝您的回答,是的,我得到更多的不同值,我明白你的答案 – William

+0

@William高興地幫助! – SqlZim

+0

@William我不確定你的意思是雙重數字,但是根據提供的示例數據,它在演示中看起來很正確:http://rextester.com/RRGFQM14769 – SqlZim

0

你也可以這樣做union allgroup by

select Code_Project, Code_Name, 
     max(Project_Name) as Project_Name, 
     sum(Total) as GrandTotal 
from ((select Code_Project, Code_Name, Project_Name, 0 as Total 
     from TransM 
    ) union all 
     (select Code_Project, Code_Name, NULL Project_Name, Total 
     from TransW 
    ) 
    ) mw 
group by Code_Project, Code_Name;