2017-02-16 60 views
0

这是我以前的的延续。我有这样一个表:SQL部分完全外部加入

Name Id  Amount 
Name1 1  99 
Name1 1  30 
Name1 9  120.2 
Name2 21  348 
Name2 21  21 
Name3 41  99 

如果我运行此查询,多亏胡安·卡洛斯·Oropeza:

SELECT 
     [Name], 
     [Id], 
     count([Amount]) as 'Count' 
FROM 
     table1 
GROUP BY [Name], [Id] 

我得到这个表:

Name Id  Count 
Name1 1  2 
Name1 9  1 
Name2 21  2 
Name3 41  1 

现在我有另一个表像这样:

Id  Return Amount 
1  100 
1  134.3 
9  912.3 
9  21 
21  23.23 
41  45 

如果我运行此查询:

SELECT 
    [Id], 
    count([Return Amount]) as 'Returns' 
FROM 
    table2 
GROUP BY [Id] 

我得到这个表:

Id  Returns 
1  2 
9  2 
21  1 
41  1 

我需要这两个表结合起来,创造一个像这样的表:

Name Id  Count  Returns 
Name1 1  2   2 
Name1 9  1   2 
Name2 21  2   1 
Name3 41  1   1 

这里是我的全外连接声明:

SELECT 
     [Name], 
     [Id], 
     count([Amount]) as 'Count' 
FROM table1 AS A 
FULL OUTER JOIN (
      SELECT 
       [Id], 
       count([Count]) as 'Returns' 
      FROM 
       table2 
      GROUP BY [Id] 
) B ON A.[Id] = B.[Id] 
GROUP BY [Name], [Id] 

但是,这给了我下面的表格:

Name Id  Count 
Name1 1  2 
Name1 9  1 
Name2 21  2 
Name3 41  1 

我如何获得Returns列连接?我不确定在这种情况下使用哪个连接,但我受过良好教育的答案是完全外连接。有任何想法吗?

+0

在你的查询中,如果你添加了选择B.Returns是什么结果? – Kostis

回答

2

元素需要引用连接表的SELECT语句。还有引用列的GROUP BY。

SELECT 
     [Name], 
     [Id], 
     count([Amount]) as 'Count', 
     B."Returns" 
FROM table1 AS A 
FULL OUTER JOIN (
      SELECT 
       [Id], 
       count([Count]) as 'Returns' 
      FROM 
       table2 
      GROUP BY [Id] 
) B ON A.[Id] = B.[Id] 
GROUP BY [Name], [Id], B."Return" 

语义,但我认为最好的做法是在同一聚合级别上JOIN表。所以我建议分别运行每个聚合表,然后加入。这可以防止意外的数据重复。像这样

SELECT 
    A.Name 
    ,A.Id 
    ,A."Count" 
    ,B."Returns" 
FROM 
    (SELECT 
     [Name], 
     [Id], 
     count([Amount]) as 'Count' 
    FROM 
     table1 
    GROUP BY [Name], [Id] 
    ) A 
FULL OUTER JOIN (
      SELECT 
       [Id], 
       count([Count]) as 'Returns' 
      FROM 
       table2 
      GROUP BY [Id] 
    ) B ON A.[Id] = B.[Id] 
0

您可以分别找到聚集,然后做加盟:

select t1.*, 
    t2.* 
from (
    select [Name], 
     [Id], 
     count([Amount]) as [Count] 
    from table1 
    group by [Name], 
     [Id] 
    ) t1 
full join (
    select [Id], 
     count([Return Amount]) as [Returns] 
    from table2 
    group by [Id] 
    ) t2 on t1.[Id] = t2.[Id]; 
2

在选择,你只能选择字段名称,ID和计数。您必须将B.returns添加到您的选择语句中。

0

您只需将返回添加到您的选择列表。如果您想要两个表中的所有行,请使用完整外连接。非匹配表的非匹配表中的字段将具有空值。

左连接或右连接将给出一个表中的所有行,并从另一个表中匹配。内部连接只会返回匹配的行。

http://www.sql-join.com/sql-join-types/

1

你已经拥有的汇总结果使用full join。当两个表中有一行丢失时,请使用COALESCE将结果显示为0或其他值。

SELECT 
COALESCE(t1.[Name],'Unknown') as Name 
,COALESCE(t1.[Id],t2.[Id]) as ID 
,COALESCE(t1.Count,0) as Count 
,COALESCE(t2.[Returns],0) as Returns 
FROM (SELECT 
     [Name], 
     [Id], 
     count([Amount]) as 'Count' 
     FROM table1 
     GROUP BY [Name], [Id]) t1 
FULL JOIN (SELECT 
      [Id], 
      count([Return Amount]) as 'Returns' 
      FROM table2 
      GROUP BY [Id]) t2 
ON t1.[Id]=t2.[Id] 
0

你只需要获取从查询乙

SELECT 
     [Name], 
     [Id], 
     B.Returns, 
     count([Amount]) as 'Count', 

FROM table1 AS A 
FULL OUTER JOIN (
      SELECT 
       [Id], 
       count([Count]) as 'Returns' 
      FROM 
       table2 
      GROUP BY [Id] 
) B ON A.[Id] = B.[Id] 
GROUP BY [Name], [Id],B.Returns