SQL Запрос на получение статуса соответствия - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь построить следующий запрос

Я получил таблицу под названием client_vendor следующим образом. Здесь хранятся данные ответов, предоставленных клиентом против поставщика на 4 вопроса.

client_vendor

create table client_vendor(clientid int, vendorid int, q1 varchar(1), q2 varchar(1), q2 varchar(1), q4  varchar(1));


insert into client_vendor values(100,1,"Y","N","N","");
insert into client_vendor values(101,1,"Y","Y","N","Y");
insert into client_vendor values(102,1,"Y","Y","","");

Клиент может ответить либо Y, либо N, либо не дать ответ на заданные вопросы. Здесь clientid=100 ответил следующим образом q1=Y, q2=N, q3=N, q4="" против vendorid=1.

У нас есть еще одна таблица с именем vendor_compliance

vendor_compliance

create table vendor_compliance(vendorid, q1 varchar(1), q2 varchar(1), q2 varchar(1), q4  varchar(1));

insert into vendor_question values(1,"Y","","N","");

Эта таблица показывает соответствие, если клиент отвечает на вопросы ожидаемыми значениями.

Здесь, если клиент отвечает на q1=Y и q3=N, тогда он совместимый. Ответы на вопросы q2 и q3 не имеют значения для vendorid=1, чтобы указать соответствие.

I w * sh, чтобы создать запрос, который будет отображать информацию о клиенте, вендоре и статусе соответствия следующим образом

clientid,vendorid,compliance_status
100    ,1       ,compliant
101    ,1       ,compliant
102    ,1       ,non-compliant

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Вы можете использовать join с некоторыми case логами c:

select cv.*,
       (case when vc.q1 <> cv.q1 and vc.q1 <> '' then 'non-compliant'
             when vc.q2 <> cv.q2 and vc.q2 <> '' then 'non-compliant'
             when vc.q3 <> cv.q3 and vc.q3 <> '' then 'non-compliant'
             when vc.q4 <> cv.q4 and vc.q4 <> '' then 'non-compliant'
             else 'compliant'
        end) as compliance
from client_vendor cv join
     vendor_compliance vc
     on cv.vendorid = vc.vendorid
1 голос
/ 10 марта 2020

Если в вашем наборе данных имеется большое количество столбцов вопросов, вы можете рассмотреть возможность объединения и агрегирования:

select 
    cv.clientid,
    cv.vendorid,
    max(case when q.qcv <> q.qvd and q.qvd <> '' then 'non-compliant' else 'compliant' end) compliance_status
from client_vendor cv
inner join vendor_compliance vd on vd.vendorid = cv.vendorid
cross apply (values (cv.q1, vd.q1), (cv.q2, vd.q2), (cv.q3, vd.q3), (cv.q4, vd.q4)) as q(qcv, qvd)
group by cv.clientid, cv.vendorid

Демонстрация на БД Fiddle :

clientid | vendorid | compliance_status
-------: | -------: | :----------------
     100 |        1 | compliant        
     101 |        1 | compliant        
     102 |        1 | non-compliant    
...