Выбор поставщиков, которые имеют по крайней мере те же коды утверждения, которые требуются в контракте - PullRequest
0 голосов
/ 20 декабря 2018

Иметь таблицу поставщиков, которые имеют «коды утверждения» (VNDAPP) и таблицу контрактов, которые имеют «коды требований» (COXA).Контракты могут иметь любое количество требований, и поставщики могут иметь любое количество разрешений.

VNDAPP: (vendor approvals table)
VNUM    (vendor number)
REQMT   (approval code)

COXA:   (contract requirements table)
CONTR   (contract number)
REQMT   (requirement)

Нужно найти всех поставщиков, имеющих одобрения, которые, как минимум, соответствуют требованиям определенного контракта.

Пример контракта 7736 имеет требования № 1 и 10. Есть 27 поставщиков, у которых оба из них как минимум.Поскольку требования являются переменными, я не могу жестко закодировать их в запросе.Я не уверен, что это квалифицируется как проблема реляционного разделения ...

SELECT VNDNO
FROM VNDAPP
LEFT JOIN COXA ON VNDAPP.REQMT = COXA.REQMT
GROUP BY VNDAPP.VNDNO
HAVING Count(COXA.REQMT) = (SELECT count(*)
FROM COXA WHERE COXA.CONTR = '7736'
GROUP BY COXA.CONTR)

Что я делаю неправильно ??

Заранее спасибо!

Пример данных:

Contract Requirement (COXA):
CONTR   REQMT
7736    1
7736    10
7737    1
7737    4
7737    6
7738    5
7739    1



Supplier Approval (VNDAPP):
VNDNO   REQMT
10019   1
10020   1
10020   2
10020   10
10021   1
10021   4
10021   5
10021   6



Desired result:
CONTR   VNDNO
7736    10020
7737    10021
7738    10021
7739    10019
7739    10020
7739    10021  

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Я думаю, вы просто хотите:

SELECT VNDNO
FROM VNDAPP JOIN
     COXA
     ON VNDAPP.REQMT = COXA.REQMT
WHERE COXA.CONTR = '7736'
GROUP BY VNDAPP.VNDNO
HAVING Count(*) = (SELECT count(*)
                   FROM COXA
                   WHERE COXA.CONTR = '7736'
                  );

То есть посчитать требования к поставщику, которые соответствуют требованиям для контракта.Затем проверьте, соответствует ли общее количество сумм по контракту.

Это предполагает, что у вас нет дублирующих требований ни с одной стороны.

0 голосов
/ 20 декабря 2018

Предположим, что у вас есть две таблицы привязок supplier_approval(supplierid, approvalid) и contracts_requirement(contractid, requirementid), где approvalid и requirementid соответствуют.Тогда вы можете использовать следующий запрос

select sa.supplierid
from supplier_approval sa
where sa.approvalid IN (
    select cr.requirementid
    from contracts_requirement cr
    where cr.contractid = 7736
 )
group by sa.supplierid
having count(distinct sa.approvalid) = (
    select count(*)
    from contracts_requirement cr
    where cr.contractid = 7736
)
...