создать вычисляемый столбец, чтобы показать, какой столбец отсутствует - PullRequest
0 голосов
/ 28 мая 2020

У меня есть требование, в котором мне нужно ввести вычисляемый столбец, чтобы показать, отсутствует ли тип A, B или C.

  • Служба может иметь от одного до многих типов (существует 10 различных «Типов»).
  • Сервис должен иметь все 3 «Типа»: AB и C.
  • Если отсутствует какой-либо из 3, мне нужно показать, какой «Тип» отсутствует.

Например, если Service ID 2 имеет тип A, тогда в вычисляемом столбце должно быть указано «Тип B и C отсутствует», если Service ID 3 имеет Type B, тогда вычисляемый столбец должен скажем, тип A и C отсутствует "et c ...

Я получил расчет, чтобы сказать" Тип AB или C отсутствует ", но у меня нет времени, чтобы разбить его на конкретные c Тип отсутствует. В конечном итоге я объединю этот результат с несколькими другими похожими запросами. Может ли кто-нибудь помочь с этим?

SELECT ri.service_id, 
       ri.name, 
       ri.creation_date, 
       'Type A B or C is missing' AS missing 
FROM   service ri 
WHERE  ri.special = 'Yes' 
  AND  ri.service_id NOT IN (SELECT DISTINCT ri.service_id 
                             FROM   service ri, 
                                    service_cust rfni, 
                                    cust rfn 
                             WHERE  ri.service_id = rfni.service_id 
                               AND  rfni.cust_id = rfn.cust_id 
                               AND  ri.special = 'Yes' 
                               AND rfn.TYPE IN( 'A', 'B', 'C' ) 


                               GROUP  BY ri.service_id 
                                 HAVING Count(DISTINCT rfn.TYPE) = 3) 

Thanks`
CREATE TABLE SERVICE
(service_id  VARCHAR(50),
name  VARCHAR( 50 ),
special  VARCHAR( 50 )
)

Insert into SERVICE (service_id,name,special) values ('1','Service1','Yes');
Insert into SERVICE (service_id,name,special) values ('2','Service2','Yes');
Insert into SERVICE (service_id,name,special) values ('3','Service3','Yes');
Insert into SERVICE (service_id,name,special) values ('4','Service4','Yes');
Insert into SERVICE (service_id,name,special) values ('5','Service5','Yes');
Insert into SERVICE (service_id,name,special) values ('6','Service6','Yes');
Insert into SERVICE (service_id,name,special) values ('7','Service7','Yes');
Insert into SERVICE (service_id,name,special) values ('8','Service8','Yes');
Insert into SERVICE (service_id,name,special) values ('9','Service9','No');





CREATE TABLE SERVICE_CUST
(cust_id  VARCHAR(50),
service_id  VARCHAR( 50 )
)

Insert into SERVICE_CUST (cust_id,service_id) values ('1','1');
Insert into SERVICE_CUST (cust_id,service_id) values ('2','1');
Insert into SERVICE_CUST (cust_id,service_id) values ('3','1');
Insert into SERVICE_CUST (cust_id,service_id) values ('4','1');
Insert into SERVICE_CUST (cust_id,service_id) values ('5','2');
Insert into SERVICE_CUST (cust_id,service_id) values ('6','3');
Insert into SERVICE_CUST (cust_id,service_id) values ('7','4');
Insert into SERVICE_CUST (cust_id,service_id) values ('8','4');
Insert into SERVICE_CUST (cust_id,service_id) values ('9','5');


CREATE TABLE CUST
(cust_id  VARCHAR(50),
type  VARCHAR( 50 )
)

Insert into CUST (cust_id,type) values ('1','A');
Insert into CUST (cust_id,type) values ('2','B');
Insert into CUST (cust_id,type) values ('3','C');
Insert into CUST (cust_id,type) values ('4','D');
Insert into CUST (cust_id,type) values ('5','A');
Insert into CUST (cust_id,type) values ('6','B');
Insert into CUST (cust_id,type) values ('7','A');
Insert into CUST (cust_id,type) values ('8','B');
Insert into CUST (cust_id,type) values ('9','F');

при выполнении этого запроса

select ri.service_id, ri.name, rfn.type
from service ri, service_cust rfni, cust rfn
where ri.service_id = rfni.service_id
and rfni.cust_id = rfn.cust_id 
and  ri.special = 'Yes'

Я получаю

1 Service1 A 1 Service1 B 1 Service1 C 1 Service1 D 2 Service2 A 3 Service3 B 4 Service4 A 4 Service4 B 5 Service5 F

Мне нужны только те услуги, которые отсутствует Тип A, B или C. Если в нем есть все 3 (A, B, C), тогда не нужно видеть в результатах. Поэтому я ищу результаты Service2 с текстом 'Missing B, C 'Service3 с текстом' Missing A, C 'Service4 с текстом' Missing C '

я думаю, что мой первый p искусство исходного запроса не работает должным образом, так как его ввод: Сервис 2,3,4,5,6,7 и 8

select  ri.service_id, ri.name
from service ri 
where ri.special = 'Yes'
and ri.service_id not in (
select distinct ri.service_id
from service ri, service_cust rfni, cust rfn
where ri.service_id = rfni.service_id
and rfni.cust_id = rfn.cust_id 
and  ri.special = 'Yes'
and rfn.type in( 'A','B', 'C')
group by ri.service_id
having count(distinct rfn.type)=3)

спасибо за помощь

`

1 Ответ

1 голос
/ 28 мая 2020

Рассмотрим условный агрегатный запрос для подсчета вхождений типов:

SELECT ri.service_id,
       ri.name,
       ri.creation_date,
       SUM(CASE WHEN rfn.TYPE = 'A' THEN 1 ELSE 0 END) AS TypeA_Count,
       SUM(CASE WHEN rfn.TYPE = 'B' THEN 1 ELSE 0 END) AS TypeB_Count,
       SUM(CASE WHEN rfn.TYPE = 'C' THEN 1 ELSE 0 END) AS TypeC_Count
FROM   service ri
LEFT JOIN service_cust rfni 
     ON ri.service_id = rfni.service_id 
LEFT JOIN cust rfn
     ON rfni.cust_id = rfn.cust_id 
WHERE  ri.special = 'Yes' 
  AND  rfn.TYPE IN( 'A', 'B', 'C' ) 
GROUP  BY ri.service_id,
          ri.name,
          ri.creation_date
HAVING COUNT(DISTINCT rfn.type) < 3

И, если нужно вернуть один столбец, интегрируйте выше в CTE:

WITH cte (
   ...same as above...
)

SELECT cte.service_id,
       cte.name,
       cte.creation_date,
       CASE 
            WHEN TypeA_Count = 0 AND TypeB > 0 AND TypeC_Count > 0 THEN 'Type A is Missing'
            WHEN TypeA_Count = 0 AND TypeB = 0 AND TypeC_Count > 0 THEN 'Type A and B are Missing'
            WHEN TypeA_Count = 0 AND TypeB > 0 AND TypeC_Count = 0 THEN 'Type A and C are Missing'
            WHEN TypeA_Count > 0 AND TypeB = 0 AND TypeC_Count > 0 THEN 'Type B is Missing'
            WHEN TypeA_Count > 0 AND TypeB = 0 AND TypeC_Count = 0 THEN 'Type B and C are Missing'
            WHEN TypeA_Count > 0 AND TypeB > 0 AND TypeC_Count = 0 THEN 'Type C is Missing'
            WHEN TypeA_Count > 0 AND TypeB > 0 AND TypeC_Count > 0 THEN 'None are Missing'
       END Missing
FROM cte
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...