Набор результатов T-SQL - с 3 таблицами - PullRequest
0 голосов
/ 05 февраля 2019

Вот мой код:

drop table if exists #Table_A
drop table if exists #Table_B
drop table if exists #Table_C

create table #Table_A
(
    [DATE] Date,
    TYPE    INT,
    QTY     INT
);

create table #Table_B
(
    [DATE] Date,
    TYPE    INT,
    QTY     INT
);

create table #Table_C
(
    [DATE] Date,
    TYPE    INT,
    QTY     INT
);

Insert into #Table_A VALUES ('2018-01-01', 1, 10)
Insert into #Table_B VALUES ('2018-01-01', 1, 5)
Insert into #Table_B VALUES ('2018-01-01', 2, 10)
Insert into #Table_B VALUES ('2018-01-01', 3, 10)
Insert into #Table_C VALUES ('2018-01-01', 1, 5)
Insert into #Table_C VALUES ('2018-01-01', 2, 10)
Insert into #Table_C VALUES ('2018-01-01', 3, 10)

Запрос:

select 
    A.[DATE], 
    SUM(CASE WHEN A.[TYPE] = 1 THEN A.QTY END)  A_QTY,
    SUM(CASE WHEN B.[TYPE] = 1 THEN B.QTY END)  B_QTY,
    SUM(CASE WHEN C.[TYPE] = 1 THEN C.QTY END)  C_QTY,
    SUM(CASE WHEN A.[TYPE] = 2 THEN A.QTY END)  A_QTY,
    SUM(CASE WHEN B.[TYPE] = 2 THEN B.QTY END)  B_QTY,
    SUM(CASE WHEN C.[TYPE] = 2 THEN C.QTY END)  C_QTY,
    SUM(CASE WHEN A.[TYPE] = 3 THEN A.QTY END)  A_QTY,
    SUM(CASE WHEN B.[TYPE] = 3 THEN B.QTY END)  B_QTY,
    SUM(CASE WHEN C.[TYPE] = 3 THEN C.QTY END)  C_QTY
FROM 
    #Table_A A 
    INNER JOIN #Table_B B ON A.DATE = B.DATE AND A.TYPE = B.TYPE
    INNER JOIN #Table_C C ON A.DATE = C.DATE AND A.TYPE = C.TYPE
GROUP BY A.[DATE]

Текущий результат:

DATE        |   A_QTY   |   B_QTY   |   C_QTY   A_QTY   B_QTY   C_QTY   A_QTY   B_QTY   C_QTY
2018-01-01  |   10      |   5       |   5       NULL    NULL    NULL    NULL    NULL    NULL

Ожидаемый результат:

DATE        |   A_QTY   |   B_QTY   |   C_QTY   A_QTY   B_QTY   C_QTY   A_QTY   B_QTY   C_QTY    
2018-01-01  |   10      |   5       |   5       NULL    10      10      NULL    10      10

Пожалуйста, дайте мне знать, как я могу получить ожидаемый результат.(Я знаю, что в настоящее время он не работает из-за inner join).

1 Ответ

0 голосов
/ 05 февраля 2019

Проблема с вашим запросом состоит в том, что, поскольку он использует INNER JOIN s, учитываются только кортежи записей / дат, которые существуют во всех 3 таблицах.

Если есть таблица, которая может всегда иметь все (TYPE, DATE) доступные кортежи (в ваших данных выборки это будет Table_C), тогда вы можете использовать его в качестве отправной точки и использовать LEFT JOIN s:

FROM #Table_C C 
LEFT JOIN #Table_A A ON A.DATE = C.DATE AND A.TYPE = C.TYPE
LEFT JOIN #Table_B B ON B.DATE = C.DATE AND B.TYPE = C.TYPE

Иначе вы, вероятно, захотите изменить INNER JOIN s на FULL OUTER JOIN s:

FROM #Table_A A 
FULL OUTER JOIN #Table_B B ON A.DATE = B.DATE AND A.TYPE = B.TYPE
FULL OUTER JOIN #Table_C C ON A.DATE = C.DATE AND A.TYPE = C.TYPE

Решение FULL OUTER JOIN требует адаптации пунктов SELECT и GROUP BY, поскольку дата может поступать из любой из 3 таблиц.

Запрос:

SELECT
    COALESCE(A.[DATE], B.[DATE], C.[DATE]) DATE,
    SUM(CASE WHEN A.[TYPE] = 1 THEN A.QTY END)  A_QTY,
    SUM(CASE WHEN B.[TYPE] = 1 THEN B.QTY END)  B_QTY,
    SUM(CASE WHEN C.[TYPE] = 1 THEN C.QTY END)  C_QTY,
    SUM(CASE WHEN A.[TYPE] = 2 THEN A.QTY END)  A_QTY,
    SUM(CASE WHEN B.[TYPE] = 2 THEN B.QTY END)  B_QTY,
    SUM(CASE WHEN C.[TYPE] = 2 THEN C.QTY END)  C_QTY,
    SUM(CASE WHEN A.[TYPE] = 3 THEN A.QTY END)  A_QTY,
    SUM(CASE WHEN B.[TYPE] = 3 THEN B.QTY END)  B_QTY,
    SUM(CASE WHEN C.[TYPE] = 3 THEN C.QTY END)  C_QTY
FROM 
    #Table_A A 
    FULL OUTER JOIN #Table_B B ON A.DATE = B.DATE AND A.TYPE = B.TYPE
    FULL OUTER JOIN #Table_C C ON A.DATE = C.DATE AND A.TYPE = C.TYPE
GROUP BY COALESCE(A.[DATE], B.[DATE], C.[DATE])

Эта демонстрация на DB Fiddle возвращает:

DATE                | A_QTY | B_QTY | C_QTY | A_QTY | B_QTY | C_QTY | A_QTY | B_QTY | C_QTY
:------------------ | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----: | ----:
01/01/2018 00:00:00 |    10 |     5 |     5 |       |    10 |    10 |       |    10 |    10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...