Соединение 2 таблиц для извлечения всех значений из каждого - PullRequest
0 голосов
/ 15 января 2020

У меня есть 2 таблицы, к которым я хочу присоединиться особым образом c для извлечения всех данных в каждой, даже если некоторые из соединенных полей могут не существовать в каждой, что-то вроде полного внешнего соединения .

Таблица A

+--------+-------+------+-------+
| Group  | Name  | Year | Value |
+--------+-------+------+-------+
|      1 | Joe   | 2018 |    23 |
|      1 | Joe   | 2019 |    56 |
|      2 | Fred  | 2019 |    89 |
|      2 | Fred  | 2020 |    45 |
+--------+-------+------+-------+

Таблица B

+-------+------+------+-------+----------+
| Group | Name | Year | Scope |  Status  |
+-------+------+------+-------+----------+
|     1 | Joe  | 2019 |    78 | Approved |
|     2 | Fred | 2018 |    12 | Approved |
|     2 | Fred | 2020 |   987 | Started  |
|     2 | Fred | 2021 |   321 | Sent     |
+-------+------+------+-------+----------+

Я хочу присоединиться к A.Group = B.Group и A.Year = B.Year, но когда год существует для одного, а не для другого, то с другой стороны показывается ноль. Таким образом, будет строка для каждого имени для каждого года и соответствующие значения или 0 / ноль в зависимости от того, что доступно. Таким образом, результат для этого примера должен выглядеть следующим образом:

Таблица A и B

+---------+--------+--------+---------+---------+--------+--------+---------+----------+
| A.Group | A.Name | A.Year | A.Value | B.Group | B.Name | B.Year | B.Scope | B.Status |
+---------+--------+--------+---------+---------+--------+--------+---------+----------+
|       1 | Joe    |   2018 |      23 |       1 | Joe    |   2018 |       0 | <null>   |
|       1 | Joe    |   2019 |      56 |       1 | Joe    |   2019 |      78 | Approved |
|       1 | Joe    |   2020 |       0 |       1 | Joe    |   2020 |       0 | <null>   |
|       1 | Joe    |   2021 |       0 |       1 | Joe    |   2021 |       0 | <null>   |
|       2 | Fred   |   2018 |       0 |       2 | Fred   |   2018 |      12 | Approved |
|       2 | Fred   |   2019 |      89 |       2 | Fred   |   2019 |       0 | <null>   |
|       2 | Fred   |   2020 |      45 |       2 | Fred   |   2020 |     987 | Started  |
|       2 | Fred   |   2021 |       0 |       2 | Fred   |   2021 |     321 | Sent     |
+---------+--------+--------+---------+---------+--------+--------+---------+----------+

Ответы [ 2 ]

1 голос
/ 15 января 2020

Если ваша база данных поддерживает CTE, вы можете использовать CTE. В другом случае вы можете использовать SUB QUERY для замены CTE, воспользовавшись помощью приведенной ниже логики c для достижения желаемого результата

DEMO HERE

WITH CTE_Group([Group],Name)
AS
(
    SELECT DISTINCT [Group],Name FROM tab_A
    UNION 
    SELECT DISTINCT [Group],Name FROM tab_B
),
CTE_Year(Year)
AS
(
    SELECT DISTINCT Year FROM tab_A
    UNION 
    SELECT DISTINCT Year FROM tab_B
)
SELECT A.[Group],A.Name,B.Year,ISNULL(C.Value,0) Value,
A.[Group],A.Name,B.Year,ISNULL(D.Scope,0) Scope,D.Status
FROM CTE_Group A
CROSS APPLY CTE_Year B
LEFT JOIN Tab_A C ON A.[Group] = C.[Group] AND B.Year = C.Year
LEFT JOIN Tab_B D ON A.[Group] = D.[Group] AND B.Year = D.Year
ORDER BY 1,3

Output-

Group   Name    Year    Value   Group   Name    Year    Scope   Status
1       Joe     2018    23      1       Joe     2018    0   
1       Joe     2019    56      1       Joe     2019    78      Approved
1       Joe     2020    0       1       Joe     2020    0   
1       Joe     2021    0       1       Joe     2021    0   
2       Fred    2018    0       2       Fred    2018    12      Approved
2       Fred    2019    89      2       Fred    2019    0   
2       Fred    2020    45      2       Fred    2020    987     Started
2       Fred    2021    0       2       Fred    2021    321     Sent
0 голосов
/ 15 января 2020

Если я правильно понимаю Дэвида, это должно быть то, что вы хотите. Дайте мне знать

Select
A.Group, A.Name, A.Year, coalesce(A.Value,0) as A.Value, B.Group, B.Name, B.Year, B.Scope, B.Status
From TableA A cross join TableB B on A.Group = B.Group and A.Year = B.Year
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...