Проблема с вашим запросом состоит в том, что, поскольку он использует 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