Ваш запрос не включает указанное выражение «ID» как часть агрегатной функции - PullRequest
0 голосов
/ 20 ноября 2018

В MSAccess у меня есть запрос ниже.При попытке выполнить запрос выдает ошибку Your query does not include the specified expression "ID" as part of aggregate function, и я не могу найти причину.В чем проблема в моем запросе?

SELECT
   Count(t2.subjectid) AS CountOfsubjectid,
   t2.pname,
   (
      select
         max(outcometime) 
      from
         table1 t1 
      where
         t1.id = t2.id 
   )
   AS showntime 
FROM
   table2 AS t2 
WHERE
   t2.outcome = "accepted" 
GROUP BY
   t2.pname,
   t2.showntime;

ОБНОВЛЕНИЕ (ОБРАЗЦЫ ДАННЫХ):

Table1:

ID  outcometime pname  outcome  subjectid
1   20181111    USB    shown    Ux1ku
1   20181113    USB    shown    Ux1ku
2   20181115    USB    shown    Tsn2f
3   20181116    USB    shown    O93nf
2   20181114    USB    shown    Tsn2f
2   20181112    USB    shown    Tsn2f

Таблица2:

ID  outcometime pname       outcome     subjectid
1   20181118    USB         accepted    Ux1ku
2   20181119    USB         accepted    Tsn2f
3   20181117    USB         accepted    O93nf

Желаемый результат:

pname     showntime     countofsubjectid
USB       20181113         1
USB       20181115         1
USB       20181116         1

Также обновлены данные примера.Это было не правильно.Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

В настоящее время вы пытаетесь запустить коррелированный подзапрос в предложении SELECT, инкапсулированном в агрегированном запросе, а затем ссылаетесь на этот самый подзапрос по псевдониму в предложении GROUP BY.

Рассмотрите возможность использования производной таблицычтобы сначала запустить уровень вашего подразделения с помощью подзапроса, а затем во внешнем главном запросе, запустите агрегацию.

SELECT 
    dt.pname,
    COUNT(subjectid) AS CountOfsubjectid,
    dt.showntime
FROM 
  (SELECT
         t2.subjectid
         t2.pname,
         (
            select
               max(outcometime) 
            from
               table1 t1 
            where
               t1.id = t2.id 
         )
         AS showntime 
   FROM
        table2 AS t2 
   WHERE
        t2.outcome = 'accepted'
  ) AS dt
GROUP BY
   dt.pname,
   dt.showntime;

Однако попробуйте не использовать неэффективный коррелированный подзапрос для каждой строки в таблице, чтобы присоединиться к агрегированному запросу дляMAX рассчитывается один раз и затем снова выполняется агрегация для COUNT на основном уровне.

SELECT
   t2.pname,
   COUNT(t.subjectid) AS CountOfsubjectid,
   agg.showntime 
FROM
   table2 AS t2 
INNER JOIN 
    (
     select 
        t1.id,
        max(outcometime) as showntime
     from
        table1 t1 
     group by 
        t1.id                     
     ) AS agg
  ON t2.id = agg.id
WHERE
   t2.outcome = 'accepted'    
GROUP BY
   t2.pname,
   agg.showntime;
0 голосов
/ 20 ноября 2018

Если я правильно понимаю, вам нужно написать это как:

SELECT Count(t2.subjectid) AS CountOfsubjectid,
       t2.name,
       (select max(outcometime) 
        from table1 as t1 inner join
             table2 as tt2
             on t1.id = tt2.id
        where tt2.name = t2.name
      ) as showntime 
FROM table2 AS t2 
WHERE t2.outcome = "accepted" 
GROUP BY t2.name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...