Исключая строки, полученные из оператора case с определенным значением на основе значений из другого столбца - PullRequest
0 голосов
/ 09 мая 2018

Как исключить строки с определенным значением в поле на основе определенных значений другого поля? Чтобы погрузиться глубже:

У меня есть столбец с именем "rule_name", который получен из оператора case.

У меня есть другой столбец с именем «DeliveryTermsIdentifier», который извлекается из другой таблицы (см. Изображение результата запроса ниже).

Я пытаюсь удалить строки с правилом_имя "Требуется событие доставки" только если DeliveryTermsIdentifier имеет значение "PP", "DA" и т. Д. Меня сбрасывают, потому что мой столбец rule_name уже основан на условии.

изображение результата запроса

Вот SQL, используемый для получения этих двух столбцов:

  ,case when s.ShipmentNo is not null then cast(dqr.rulename as varchar(30))
        else cast(dqc.dataqualityruleid as varchar(30)) end as rule_name

  ,case when (dqd.SuccessFlag = 0) then 'Missing'
        when (dqd.SuccessFlag = 1) then 'Reported'
        when (s.ShipmentNo is null) then 'Missing' end reporting_result

  ,s.DeliveryTermsIdentifier

from CustomerMasterList cml

join organization o on o.organizationid = cml.senderid
inner join DataQualityConfig dqc on dqc.DomainId = cml.DomainID
left outer join shipment s on s.shipmentno = cml.shipmentno
left outer join dataqualityresult dqd on dqd.shipmentid = s.shipmentid 
left outer join dataqualityrule dqr on dqr.dataqualityruleid 
=dqd.dataqualityruleid 

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вы также можете инкапсулировать ваши операторы case во внешнее приложение и использовать псевдоним, подобный этому:

SELECT * ,
   rules.rule_name ,
   RESULT.reporting_result ,
   s.DeliveryTermsIdentifier
FROM   CustomerMasterList cml
   JOIN organization o ON o.organizationid = cml.senderid
   INNER JOIN DataQualityConfig dqc ON dqc.DomainId = cml.DomainID
   LEFT OUTER JOIN shipment s ON s.shipmentno = cml.shipmentno
   LEFT OUTER JOIN dataqualityresult dqd ON dqd.shipmentid = s.shipmentid
   LEFT OUTER JOIN dataqualityrule dqr ON dqr.dataqualityruleid = dqd.dataqualityruleid
   OUTER APPLY (   SELECT CASE WHEN ( dqd.SuccessFlag = 0 ) THEN 'Missing'
                               WHEN ( dqd.SuccessFlag = 1 ) THEN 'Reported'
                               WHEN ( s.ShipmentNo IS NULL ) THEN 'Missing'
                          END reporting_result ) RESULT
   OUTER APPLY (   SELECT CASE WHEN s.ShipmentNo IS NOT NULL THEN
                                   CAST(dqr.rulename AS VARCHAR(30))
                               ELSE
                                   CAST(dqc.dataqualityruleid AS VARCHAR(30))
                          END AS rule_name ) rules
WHERE  s.DeliveryTermsIdentifier NOT IN ( 'PP', 'DA' )
   AND rules.rule_name <> 'Delivery event required';
0 голосов
/ 09 мая 2018

Один из способов - поместить то, что у вас есть, в подзапрос и отфильтровать его с помощью предложения where во внешнем запросе. Э.Г.

SELECT rule_name, reporting_result, DeliveryTermsIdentifier
FROM
  (SELECT 'X'
  ,case when s.ShipmentNo is not null then cast(dqr.rulename as varchar(30))
        else cast(dqc.dataqualityruleid as varchar(30)) end as rule_name

  ,case when (dqd.SuccessFlag = 0) then 'Missing'
        when (dqd.SuccessFlag = 1) then 'Reported'
        when (s.ShipmentNo is null) then 'Missing' end reporting_result

  ,s.DeliveryTermsIdentifier

  from CustomerMasterList cml

  join organization o on o.organizationid = cml.senderid
  inner join DataQualityConfig dqc on dqc.DomainId = cml.DomainID
  left outer join shipment s on s.shipmentno = cml.shipmentno
  left outer join dataqualityresult dqd on dqd.shipmentid = s.shipmentid 
  left outer join dataqualityrule dqr on dqr.dataqualityruleid 
  =dqd.dataqualityruleid ) AS sub
WHERE DeliveryTermsIdentifier NOT IN ('PP', 'DA') AND rule_name <> 'Delivery event required'
...