我正在尝试构建以下查询
我得到了一个名为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=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
表示遵从无关。
我希望创建一个查询,该查询将显示如下的clientid,vendorid和合规性状态
clientid,vendorid,compliance_status
100 ,1 ,compliant
101 ,1 ,compliant
102 ,1 ,non-compliant
答案 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
clientid | vendorid | compliance_status -------: | -------: | :---------------- 100 | 1 | compliant 101 | 1 | compliant 102 | 1 | non-compliant