Я не могу использовать group by во вложенном запросе ms access - PullRequest
0 голосов
/ 03 января 2019

У меня проблема с использованием вложенных запросов в MS-доступе.Эти запросы прекрасно работают в SQL Developer.

Access SQL: -

select 
  B.prDate,
  B.Month, 
  (select C.Entity_Id,avg(C.prclose) 
   from **B** as C 
   where C.Month>=B.Month 
     and C.Month <= B.Month+3 
   group by C.Entity_Id)
from (
  select  A.Entity_Id, A.prDate, A.prclose , 
   (
    (SELECT max(ID) 
     FROM sheet1 where  Entity_Id=A.Entity_Id 
    ) - 
    (SELECT ID 
     FROM sheet1 where  ID=A.Id) +1
   ) as  Month  
  from sheet1 as A 
  order by Month, A.Entity_Id asc
) B 

или

, вы можете заменить указанный псевдоним следующим запросом

select B.prDate, B.Month , ((select C.Entity_Id,avg(C.prclose) from 
(select  A.Entity_Id,A.prDate,A.prclose , ((SELECT max(ID) FROM sheet1 where  Entity_Id=A.Entity_Id ) -  (SELECT ID FROM sheet1 where  ID=A.Id ) +1) as  Month  from sheet1 as A order by Month, A.Entity_Id asc) B  as C where C.Month>=B.Month and  C.Month <= B.Month+3 group by C.Entity_Id  )) 

from 

(select  A.Entity_Id,A.prDate,A.prclose , ((SELECT max(ID) FROM sheet1 where  Entity_Id=A.Entity_Id ) -  (SELECT ID FROM sheet1 where  ID=A.Id ) +1) as  Month  from sheet1 as A order by Month, A.Entity_Id asc) B 

Другие SQL: -

select B.prDate, B.Month , (select C.Entity_Id,avg(C.prclose) from B) as C where C.Month>=B.Month and  C.Month <= B.Month+3 group by C.Entity_Id   from  
(select  A.Entity_Id,A.prDate,A.prclose , ((SELECT max(ID) FROM sheet1 where  Entity_Id=A.Entity_Id ) -  (SELECT ID FROM sheet1 where  ID=A.Id ) +1) as  Month  from sheet1 as A order by Month, A.Entity_Id asc) B 

1 Ответ

0 голосов
/ 03 января 2019

В подзапросах предложения SELECT нельзя возвращать более одного поля при попытке выполнить агрегированный запрос.Чтобы решить, поскольку вам нужно повторно использовать B , рассмотрите возможность сохранения этого набора результатов в промежуточном внешнем запросе и ссылки на него в конечном запросе:

Промежуточный запрос (сохранить как объект запроса MS Access; последнее вложенное SELECT избыточно)

SELECT A.Entity_Id, A.prDate, A.prclose, 
       ((SELECT MAX(sub.ID) 
         FROM sheet1 sub
         WHERE sub.Entity_Id = A.Entity_Id) - sub.ID) + 1 AS [Month]
FROM sheet1 as A

Окончательный запрос

SELECT q.Entity_Id, q.prDate, q.[Month],
       (SELECT AVG(sub_q.prclose)
        FROM mySavedQuery AS sub_q
        WHERE sub_q.Entity_Id = q.Entity_Id
          AND sub_q.[Month] >= q.[Month] 
          AND sub_q.[Month] <= q.[Month] + 3 
       ) AS Avg_PrClose
FROM mySavedQuery AS q
ORDER BY q.[Month], q.Entity_Id

Когданаступает день, когда MS Access SQL поддерживает CTE (или вы увеличиваете размер до корпоративной СУБД), вы можете превратить сохраненный объект запроса в условие WITH для одного оператора:

WITH mySavedQuery AS
  (SELECT A.Entity_Id, A.prDate, A.prclose, 
          ((SELECT MAX(sub.ID) 
            FROM sheet1 sub
            WHERE sub.Entity_Id = A.Entity_Id) - sub.ID) + 1 AS [Month]
   FROM sheet1 as A)

SELECT q.Entity_Id, q.prDate, q.[Month],
       (SELECT AVG(sub_q.prclose)
        FROM mySavedQuery AS sub_q
        WHERE sub_q.Entity_Id = q.Entity_Id
          AND sub_q.[Month] >= q.[Month] 
          AND sub_q.[Month] <= q.[Month] + 3 
       ) AS Avg_PrClose
FROM mySavedQuery AS q
ORDER BY q.[Month], q.Entity_Id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...