2017-02-16 3 views
-1

Это продолжение моего previous post. Мои две таблиц выглядеть следующим образом:SQL Union with Join

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, но я не уверен, как это сделать, все, что я пробовал, приводит к синтаксической ошибке из-за этого объединения.

Каков правильный путь?

Update 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 shoud be 1 not 2 .. – scaisEdge

+0

Возможный дубликат [SQL Partial Full Outer Join] (http: // stackoverflow. com/questions/42280207/sql-partial-full-external-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

@ Рихард: Вот как вы назвали столбец: 'Return Amount' – dnoeth

+0

СОВЕРШЕННО, ЭТО РАБОТАЕТ! – Richard

1

Глядя на вашу дату кажется вам нужно аа левого присоединиться и группа по

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, поскольку мы не знаем, существует ли имя или идентификатор в обеих таблицах, таких как 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