2017-02-16 4 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 

If私はこのクエリを実行します。

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

私はこのテーブルを取得:

Id  Returns 
1  2 
9  2 
21  1 
41  1 

私はこのようなテーブルを作成するには、これらの2つのテーブルを結合する必要があります。ここでは

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.を選択して結果を返しますか? – Kostis

答えて

2

から要素を取得する必要があります。また、その列を参照している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を選択し、カウントされます。 select文にB.returnsを追加する必要があります。

0

あなたは選択リストに返品を追加するだけで済みます。両方のテーブルのすべての行が必要な場合は、完全外部結合を使用します。一致しないテーブルのフィールドには、一致しないフィールドにはNULL値が入ります。

左結合または右結合では、1つのテーブル内のすべての行が他のテーブルから一致します。内部結合は、一致する行だけを返します。

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文で結合テーブルを参照する必要クエリB

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