SQL поиск группы и сопоставление между двумя таблицами - PullRequest
0 голосов
/ 31 марта 2020

Работа над миграцией физической безопасности. Есть две таблицы. В первой таблице (AreaAccess) перечислены держатели бейджа с указанием зоны, к которой у держателя бейджа есть доступ. Вторая таблица (AreaGroups) имеет areaid, сгруппированные по наборам. Цель состоит в том, чтобы прочитать записи AreaAccess владельца карты, а затем выполнить поиск в AreaGroups для подсчета наилучшего или точного соответствия областей держателя карты группе.

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

@ Роберт - спасибо за ответ. Это мой запрос, который я обработал вчера. Глядя только на двух примеров пользователей (23006 и 28190). Результатом является полный отчет об участках, в которые входят эти пользователи. То, что я пытался сделать, поэтому вопрос вчерашнего дня, это ограничить запрос пятью основными счетами для каждого держателя карты. Попытка использовать обработку ROW_NUMBER, но она не работала в основном из-за псевдонима "count (g.areaid)" в выборе. Я также пробовал многочисленные подзапросы, но безрезультатно.

select  g.AreaGroupID, ag.caption, count(g.areaid) as AreaCount, a.CardholderID
from AHBadgeActivity B
join areaaccess a on a.CardholderID=b.CardholderID
left join AreaGroupSet g
on         g.areaid=a.AreaID
left join AreaGroup ag on AG.AreaGroupID=g.AreaGroupID
where (a.CardholderID=23006 or a.CardholderID=28190) and DeleteFlag=0 and g.AreaGroupID <> 0
group by g.AreaGroupID, ag.Caption, a.CardholderID
order by a.cardholderid, AreaCount desc

Вот пример вывода. Моя цель - ограничить пять лучших AreaCounts для каждого держателя карты.

Вывод из запроса

0 голосов
/ 01 апреля 2020

Любопытно, почему вы сначала не сделали этого. Если вы не знакомы с SQL, вот отличная ссылка для начала: https://www.w3schools.com/sql/

Кроме того, крайне полезно, если вы можете предоставить образец того, что вы хотите результат, чтобы выглядеть. Это не должно быть причудливо, просто несколько строк / столбцов, которые могут продемонстрировать то, что вы надеетесь увидеть.

Вот возможный взгляд. Тем не менее, ваш вопрос немного расплывчат, так что это лучшее предположение.

create table ##CardToArea --Is this table a log, or is it grouping of permission? I'm treating it as a log, but the wording of your question isn't quite clear.
    (
    CardholderID int not null
    , AreaID int not null
    );

insert into ##CardToArea
    (CardholderID,AreaID)
values
    (1961,11)
    ,(1961,25)
    ,(1961,28)
    ,(1961,71)
    ,(1961,73)
    ,(1961,74)
    ,(1961,44)
    ,(1961,50)
    ,(1961,51)
    ,(1961,52);


create table ##AreaToGroup
    (
    AreaID int not null
    , AreaGroupID int not null
    , unique (AreaID,AreaGroupID)
    );

insert into ##AreaToGroup
    (AreaID,AreaGroupID)
values
    (33,0)
    ,(45,0)
    ,(45,7)
    ,(19,16)
    ,(17,16)
    ,(11,16)
    ,(11,48)
    ,(17,48)
    ,(17,49)
    ,(15,49)
    ,(11,49);

select
    isnull(convert(nvarchar,atg.AreaGroupID),'Not defined') as [AreaGroupID]
    , cta.CardholderID
    , count(*) as [CountOfAccesses]
from ##CardToArea as cta
    left join ##AreaToGroup as atg on cta.AreaID = atg.AreaID
group by
    atg.AreaGroupID
    , cta.CardholderID;

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