在 sql 服务器中找到丢失的组条目
Find the missing group entry in sql server
我有以下 table:
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
你们能帮我看看我哪里出错了吗:
试试这个:
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]
)
您想要 select 而不是 table 中的值。为此,您必须首先创建这些值。你用交叉连接来做到这一点:
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;
我看到这里已经有了答案,但这是我的看法,看起来与我的相似,但效率可能较低,但嘿,越多越好:)
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
我有以下 table:
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
你们能帮我看看我哪里出错了吗:
试试这个:
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]
)
您想要 select 而不是 table 中的值。为此,您必须首先创建这些值。你用交叉连接来做到这一点:
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;
我看到这里已经有了答案,但这是我的看法,看起来与我的相似,但效率可能较低,但嘿,越多越好:)
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