SQL查询以获取合规性状态

时间:2020-03-10 18:06:26

标签: sql sql-server tsql join

我正在尝试构建以下查询

我得到了一个名为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","","");

客户可以回答是或否,也可以不回答所提出的问题。 在这里clientid=100针对q1=Y的回答如下q2=Nq3=Nq4=""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=Yq3=N,那么他是合规的。 q2和q3的答案与vendorid=1表示遵从无关。

我希望创建一个查询,该查询将显示如下的clientid,vendorid和合规性状态

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

2 个答案:

答案 0 :(得分:2)

您可以将join与某些case逻辑结合使用:

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 :(得分:1)

如果您的数据集包含大量的问题列,则可能需要考虑取消透视和聚合:

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

Demo on DB Fiddle

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