我有下表:
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
你们能帮我解决这个问题吗?
答案 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]
)
答案 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;
答案 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