2017-02-16 51 views
-1

这是我的previous post的延续。我的两个表如下所示:SQL联合加入

Table1 
Name Id  Amount 
Name1 1  99 
Name1 1  30 
Name1 9  120.2 
Name2 21  348 
Name2 21  21 
Name3 41  99 
Name6 20  23 

Table2 
Name Id  Return Amount 
Name1 1  99 
Name1 1  30 
Name1 9  120.2 
Name2 21  348 
Name2 21  21 
Name3 41  99 
Name4 19  923.2 
Name5 23  12 

我需要一个结果表看起来像这样:

Name Id  Amounts Returns 
Name1 1  2   2 
Name1 9  1   2 
Name2 21  2   1 
Name3 41  1   1 
Name4 1  0   1 
Name5 23  0   1 
Name6 20  1   0 

我已经试过这样的事情:

SELECT 
    [Name], 
    [Id], 
    ISNULL(count([Amount]), 0) as 'Amounts' 
FROM table1 AS A 
GROUP BY [Name], [Id] 
UNION (
      SELECT 
       [Name], 
       [Id], 
       ISNULL(count([Return Amount]), 0) as 'Returns' 
      FROM 
       table2 AS B 
      GROUP BY [Name], [Id] 
) 

但是,这给了我:

Name Id  Amounts 
Name1 1  4 
Name1 9  3 
Name2 21  3 
Name3 41  2 
Name4 1  1 
Name5 23  1 
Name6 20  1 

我知道我需要把Return Amount放在SELECT语句中,但我不知道该怎么做,因为这个联合,我尝试过的所有东西都会导致语法错误。

这是怎么回事?

更新1: 尝试

SELECT 
    A.[Name], 
    A.[Id], 
    count(A.[Amount]), 
    count(B.[Return]) 
FROM (
    SELECT 
     [Name], 
     [Id], 
     count([Amount]) as 'Amounts' 
    FROM table1 
    UNION 
    SELECT 
      [Name], 
      [Id], 
      count([Return]) as 'Returns' 
    FROM table2 
) AS A 
LEFT JOIN table2 as B on A.[Id] = B.[Id] 
GROUP BY A.[Name], A.[Id] 

但我得到的错误:

Msg 8120, Level 16, State 1, Line 8 
Column 'table1.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 
Msg 207, Level 16, State 1, Line 4 
Invalid column name 'Amount'. 
+1

你刚才问这个吗?你可以用这个答案来解决这个问题。 http://stackoverflow.com/questions/42280207/sql-partial-full-outer-join – manderson

+0

返回9应该是1不是2 .. – scaisEdge

+0

可能重复[SQL部分完全外部联接](http:// stackoverflow。 com/questions/42280207/sql-partial-full-outer-join) –

回答

1

结合这两个表使用UNION和分拆数量并返回两列:

select name, id, count(Amount) AS Amounts, count("Return Amount") AS returns 
from ( 
    select name, id, Amount, NULL as "Return Amount" 
    from table1 
    union all 
    select name, id, NULL, "Return Amount" 
    from table2 
) t1 
group by name, id 
+0

@Richard:那么,你就是这样命名的:'回报金额' – dnoeth

+0

完美,这工作! – Richard

1

寻找你的日期看来你需要AA左连接和group by

select a.name, a.id, count(a.Amount) Amountes, count(b.Returns) 
from ( 
    select name, id, Amount 
    from table1 
    union 
    select name, id, `Return Amount` 
    from table2 
) t1 as a 
left join Table2 as b on a.id = b.id 
group by a.name, a.id 
+0

这不会给我我想要的,因为'name4'和'name5'不会出现在结果表中,因为它们的ID与表中的任何内容都不匹配。我基本上需要结合两个表,然后结合任何地方有重复的'身份证号码 – Richard

+0

答案更新。 – scaisEdge

+0

我必须进行编辑,但这仍然无效。在帖子中更新 – Richard

0

我会在加入之前得到计数,所以我们没有人为计数通胀的问题,这是由于表之间的换算。我也不明白为什么一个工会是必要的,因为一个完整的外部联合似乎会工作...

我们必须使用coalesce,因为我们不知道名称或ID是否存在于两个表中,例如Name 6和名字5

SELECT Coalesce(T1.Name, T2.Name) as Name 
    , Coalesce(T1.ID, T2.ID) as ID 
    , Coalesce(T1.Amount,0) as Amount 
    , coalesce(T2.Returns,0) as Returns 
FROM (SELECT Name, ID, count(1) as Amount from table1 GROUP BY name, ID) T1 
FULL OUTER JOIN 
    (SELECT Name, ID, count(1) as Returns from table2 GROUP BY name, ID) T2 
on T1.Name = T2.Name 
and T1.ID = T2.ID 
+0

同意并更正。 – xQbert