Найдите пропущенную запись группы на сервере sql - PullRequest
1 голос
/ 04 августа 2020

У меня есть таблица ниже:

 Declare @t table (Name nvarchar(80))
 
 Insert into @t values 
 
 ('ABC:CE')
 ,('ABC:LI')    
 ,('ABC:XP')    
 ,('ABD:CE')    
 ,('ABD:LI')    
 ,('ABE:LI')    
 ,('ABE:XP')    
 ,('ABF:XP')

У меня есть 3 категории CE, LI, XP. Я хотел проверить, какая группа отсутствует в названии.

Я пробовал ниже Запрос:

 select  SUBSTRING(Name,1,charindex(':',Name)-1),count(1) as grplist from @t
 group by SUBSTRING(Name,1,charindex(':',Name)-1)
 having count(1) <3

Ожидаемый результат:

Name    
ABD:XP  
ABE:CE  
ABF:LI  
ABF:CE

Ребята, вы можете мне помочь, где Я ошибаюсь:

Ответы [ 3 ]

4 голосов
/ 04 августа 2020

Попробуйте следующее:

 Declare @t table (Name nvarchar(80))
 
 Insert into @t values 
 
 ('ABC:CE')
 ,('ABC:LI')    
 ,('ABC:XP')    
 ,('ABD:CE')    
 ,('ABD:LI')    
 ,('ABE:LI')    
 ,('ABE:XP')    
 ,('ABF:XP');


WITH DataSource ([group], [category]) AS
(
    SELECT SUBSTRING([Name], 1, CHARINDEX(':', [Name]) - 1)
          ,SUBSTRING([Name], CHARINDEX(':', [Name]) + 1, 100)
    FROM @t
)
SELECT DISTINCT G.[group], C.[category]
FROM DataSource G
CROSS APPLY
(
    SELECT DISTINCT [category]
    FROM DataSource
) C
WHERE NOT EXISTS
(
    SELECT 1 
    FROM DataSource DS
    WHERE DS.[group] = G.[group]
        AND DS.[category] = C.[category]
)

введите описание изображения здесь

2 голосов
/ 04 августа 2020

Вы хотите выбрать значения, которые не в таблице. Чтобы это произошло, вы должны сначала создать эти значения. Вы делаете это с помощью перекрестного соединения:

select n.name + ':' + c.category as missing
from (select distinct substring(name, 1, charindex(':', name) - 1) as name from @t) n
cross join (values ('CE'), ('LI'), ('XP')) c(category)
except
select name from @t
order by missing;

Демо: http://www.sqlfiddle.com/#! 18 / c99228 / 4

0 голосов
/ 04 августа 2020

Я вижу, что здесь уже есть ответ, но вот мой вариант, похоже, мой может быть менее эффективным, но эй больше, тем лучше :)

 Declare @t table (Name nvarchar(80)) 
Insert into @t values  
 ('ABC:CE')
 ,('ABC:LI')    
 ,('ABC:XP')    
 ,('ABD:CE')    
 ,('ABD:LI')    
 ,('ABE:LI')    
 ,('ABE:XP')    
 ,('ABF:XP')

Declare @c table (Cat nvarchar(2)) 
Insert into @c values  
 ('CE')
 ,('LI')  
 ,('XP')


SELECT 
    possible.prefix
    ,possible.Cat
    ,possible.prefix + ':' + possible.Cat
    --,selector.Prefix
    --,selector.suffix

FROM
(
select  
    SUBSTRING(Name,1,charindex(':',Name)-1) as prefix
    ,SUBSTRING(Name,charindex(':',Name)+1,2) as suffix
from @t

) as selector
right Join 
(
    SELECT DISTINCT
        SUBSTRING(Name,1,charindex(':',Name)-1) as prefix
    --  ,SUBSTRING(Name,charindex(':',Name)+1,2) as suffix
        ,Cat
    FROM @t
    cross join @c
) possible
ON selector.prefix = possible.prefix
and selector.suffix = possible.Cat
where selector.suffix is null
...