#sql #ms-access #join
#sql #ms-access #Присоединиться
Вопрос:
В MS Access создается раздражающий отчет, и мне приходится делать запрос для диаграммы.
ПРОБЛЕМА
Мой запрос использует 3 почти идентичных подзапроса (только с разными WHERE
предложениями) для вывода значений в каждый из 3 столбцов. Когда я делаю это с 2 подзапросами, оно работает нормально — однако, как только добавляется третий, он выдает ошибку.
Код до сих пор:
SELECT AllOpps.Week, AllOpps.WeekNum, AllOpps.TotalOpps As Total_Movement, 250000 AS TotalTarget, NewInv.Total AS New_Investigates
FROM(
SELECT Format([OppMovs (Base)].DateTime,"ww mmm yy") AS Week, Sum([OppMovs (Base)].VALUE) AS TotalOpps, Val(Format([OppMovs (Base)].DateTime,"ww")) AS WeekNum
FROM [OppMovs (Base)]
WHERE Year([OppMovs (Base)].[DateTime])>=2020
AND ([OppMovs (Base)].To LIKE '*1 Investigate*'
OR [OppMovs (Base)].To LIKE '*2 Research*'
OR [OppMovs (Base)].To LIKE '*3 Proposal*'
OR [OppMovs (Base)].To LIKE '*4 Test*'
OR [OppMovs (Base)].To LIKE '*5 Evaluate*'
OR [OppMovs (Base)].To LIKE '*6 Implement*'
OR [OppMovs (Base)].To LIKE '*7 Client*')
GROUP BY Format([OppMovs (Base)].DateTime,"ww mmm yy"), Val(Format([OppMovs (Base)].DateTime,"ww"))
) AllOpps RIGHT JOIN(
SELECT Format([OppMovs (Base)].DateTime,"ww mmm yy") AS Week, Sum([OppMovs (Base)].VALUE) AS Total, Val(Format([OppMovs (Base)].DateTime,"ww")) AS WeekNo
FROM [OppMovs (Base)]
WHERE Year([OppMovs (Base)].[DateTime])>=2020
AND [OppMovs (Base)].To LIKE '*1 Investigate*'
GROUP BY Format([OppMovs (Base)].DateTime,"ww mmm yy"), Val(Format([OppMovs (Base)].DateTime,"ww"))
) NewInv ON AllOpps.WeekNum = NewInv.WeekNo RIGHT JOIN (
SELECT Format([OppMovs (Base)].DateTime,"ww mmm yy") AS Week, Sum([OppMovs (Base)].VALUE) AS Total, Val(Format([OppMovs (Base)].DateTime,"ww")) AS WeekNr
FROM [OppMovs (Base)]
WHERE Year([OppMovs (Base)].[DateTime])>=2020
AND [OppMovs (Base)].To LIKE '*7 Client*'
GROUP BY Format([OppMovs (Base)].DateTime,"ww mmm yy"), Val(Format([OppMovs (Base)].DateTime,"ww"))
) NewClients ON AllOpps.WeekNum = NewClients.WeekNr
ORDER BY AllOpps.WeekNum
Выдано сообщение об ошибке:
Синтаксическая ошибка (отсутствует оператор) в выражении запроса ‘AllOpps.WeekNum = NewInv .Неделя БЕЗ ПРАВИЛЬНОГО СОЕДИНЕНИЯ (ВЫБЕРИТЕ формат ([OppMovs (Базовый)].DateTime,»ww mmm yy») КАК неделя, сумма ([OppMovs (база)].ЗНАЧЕНИЕ) КАК итог, значение (Формат([OppMovs (база)].Дата-время, «ww»)) КАК WeekNr ИЗ [OppMovs (база)], ГДЕ Year([OppMovs (база)] .[DateTime])>=202
Кто-нибудь может сказать мне, почему это так? Я пытался различать имена переменных, различные виды объединений и т. Д., Но на самом деле понятия не имею.
Большое спасибо.
Ответ №1:
Вам не нужны все эти RIGHT JOIN
s. Просто используйте условную агрегацию. Это в значительной степени делает то, что делают ваши RIGHT JOIN
s:
SELECT Format([OppMovs (Base)].DateTime,"ww mmm yy") AS Week,
Sum([OppMovs (Base)].VALUE) AS TotalOpps,
SUM(IIF([OppMovs (Base)].To LIKE '*1 Investigate*', [OppMovs (Base)].VALUE), 0) as Total_Investigate,
SUM(IIF([OppMovs (Base)].To LIKE '*7 Client*', [OppMovs (Base)].VALUE), 0) as Total_Client
Val(Format([OppMovs (Base)].DateTime,"ww")) AS WeekNum
FROM [OppMovs (Base)]
WHERE Year([OppMovs (Base)].[DateTime]) >= 2020 AND
([OppMovs (Base)].To LIKE '*1 Investigate*' OR
[OppMovs (Base)].To LIKE '*2 Research*' OR
[OppMovs (Base)].To LIKE '*3 Proposal*' OR
[OppMovs (Base)].To LIKE '*4 Test*' OR
[OppMovs (Base)].To LIKE '*5 Evaluate*' OR
[OppMovs (Base)].To LIKE '*6 Implement*' OR
[OppMovs (Base)].To LIKE '*7 Client*'
)
GROUP BY Format([OppMovs (Base)].DateTime, "ww mmm yy"),
Val(Format([OppMovs (Base)].DateTime,"ww"))
Комментарии:
1. Гордон, ты гений. Спасибо
Ответ №2:
В MS Access вам нужны круглые скобки вокруг каждого последующего соединения, например, next:
select ...
from
((t1
join t2 on ...)
join t3 on ...)
join t4 on ...
Комментарии:
1. Извините, я не совсем понимаю? Итак, какую скобку я бы удалил из строки
) NewInv ON AllOpps.WeekNum = NewInv.WeekNo RIGHT JOIN (
, например?2. Вы не удаляете скобки, вы добавляете некоторые —
SELECT ... FROM (( SELECT Format...
и) NewInv ON AllOpps.WeekNum = NewInv.WeekNo) RIGHT JOIN (
, например