2017-02-16 28 views
0

Это продолжение моих предыдущих . У меня есть таблица вроде этого:SQL Partial Full Outer Join

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

Если я запускаю этот запрос, благодаря Juan Carlos Оропеза:

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

Вы должны ссылаться на соединенную таблицу в ЗЕЬЕСТЕ. А также 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

В избранных, вы только выбрать поля имя, идентификатор, и сосчитать. Вы должны добавить B.returns в свой оператор select.

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

Вам просто нужно получить элементы из запроса 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