在SQL Server中找到丢失的组条目

时间:2020-08-04 07:06:32

标签: sql sql-server tsql sql-server-2008

我有下表:

 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 个答案:

答案 0 :(得分:4)

尝试一下:

 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]
)

enter image description here

答案 1 :(得分:2)

您要选择表中 not 的值。为此,必须首先创建这些值。您可以通过交叉联接来做到这一点:

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

答案 2 :(得分:0)

我看到这里已经有一个答案了,但这是我的看法,看起来类似我的可能效率较低,但更多的是商人:)

 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
相关问题