Предложение From не соединяется с 3 аналогичными, но работает с 2

#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 ( , например