Возникли проблемы с использованием count () в запросе Access SQL - PullRequest
0 голосов
/ 01 апреля 2011

Использование Access 2007.

У меня есть таблица инвентаризации со следующими полями:

ContainerID FolderID

Моя цель - выяснить, какие FolderIDs соответствуют более чем одному ContainerID, и какие ContainerIDs предназначены для этих записей. Я подумал, что лучший способ справиться с этим - сделать запрос, который возвращает ContainerID, FolderID и счетчик каждого FolderID, чтобы я мог отсортировать этот список, чтобы поместить записи с количеством> 1 сверху. Я пробовал это с:

select ContainerID,FolderID,count(FolderID) from (select distinct * from Inventory);

но Access выдал мне сообщение об ошибке: «Вы попытались выполнить запрос, который не включает указанное выражение« ContainerID »как часть статистической функции».

Как я могу получить результаты, которые я ищу?

EDIT: Я пробую все ваши решения, но все они продолжают получать много повторяющихся строк. Я просто пытался отфильтровать их с помощью DISTINCT, но по какой-то причине заморозил Access. Я должен идти домой, чтобы проверить это завтра утром. Спасибо за предложения.

Ответы [ 4 ]

4 голосов
/ 01 апреля 2011

Это должно сработать:

SELECT ContainerID, FolderID, count(FolderID) 
FROM    Inventory 
GROUP BY ContainerID, FolderID; 

Чтобы функции подсчета работали с определенными группировками, необходимо использовать GROUP BY, иначе он работает со всеми доступными данными.Если у вас не было ровно одной уникальной комбинации ContainerID и FolderID, вы не можете выбрать эти поля вместе с результатами агрегатной функции count.

1 голос
/ 01 апреля 2011

Шаг 1: Получить FolderID, которые имеют более одного ContainerID:

select folderid 
from inventory 
group by folderid 
having count(folderid)>1

Шаг 2: Получить список всех этих FolderID и соответствующих им ContainerID:

select * 
from inventory 
where folderid in
(
   select folderid 
   from inventory 
   group by folderid 
   having count(folderid)>1
)
order by folderid, containerid
1 голос
/ 01 апреля 2011

Попробуйте следующий запрос.

select
     I.*
    ,T.FolderCount
from
    Inventory I
inner join
(
    select
          ContainerID
        , Count(*) as FolderCount
    from
        Inventory
    group by
        ContainerID
    having
        Count(*) > 1
) T
on
    I.ContainerID = T.ContainerID

РЕДАКТИРОВАТЬ:

select
     I.*
    ,T.ContainerCount
from
    Inventory I
inner join
(
    select
          FolderID
        , Count(*) as ContainerCount
    from
        Inventory
    group by
        FolderID
    having
        Count(*) > 1
) T
on
    I.FolderID = T.FolderID
0 голосов
/ 01 апреля 2011

К сожалению, у меня нет доступа 2007, но в SQL Server работает следующее:

create table Inventory
(
 ContainerID int,
 FolderID int
)

insert into Inventory (ContainerID, FolderID)
select 1, 1
union all select 1, 2
union all select 1, 3
union all select 1, 1
union all select 2, 1
union all select 2, 2
union all select 3, 1

select distinct i1.ContainerID, i1.FolderID
from Inventory i1
inner join (select FolderID
            from Inventory a
            group by FolderID
            having count(distinct ContainerID) > 1) i2
on i1.FolderID = i2.FolderID

Добавлен пример для пояснения того, почему я отправил этот ответ.Исходя из моего понимания вопроса, в результате были получены пары контейнер / папка с несколькими идентификаторами контейнеров, а не несколькими строками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...