Sql server 查找在每个项目中仅提供服务2的承包商
我有一个Sql server 查找在每个项目中仅提供服务2的承包商,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我有一个项目表格。每一行都是项目的服务或产品 Project Contractor Service ======= ========== ======= 1 B S1 1 A S2 1 A S3 1 C S1 2 D S2 2 A S1 2
项目
表格。每一行都是项目的服务或产品
Project Contractor Service
======= ========== =======
1 B S1
1 A S2
1 A S3
1 C S1
2 D S2
2 A S1
2 B S3
3 E S2
3 B S1
3 C S2
我想找到在一个项目上提供S2,但在提供S2的同一个项目上没有提供任何其他服务的承包商
1 NULL
2 D
3 E
3 C
我在SQL中提取数据,并在Excel中对其进行过滤和分组,但我想找到一种在SQL中执行此操作的方法。使用SQL Server 2005。我将使用反半联接(
不存在
语句):
;WITH ServiceCount AS (
-- Contractor projects that have only one service
SELECT Project, Contractor, COUNT(*) as [Count]
FROM Projects
GROUP BY Project, Contractor
HAVING COUNT(*) = 1
)
SELECT
sc.Project,
sc.Contractor
FROM ServiceCount sc
JOIN Projects p
ON p.Project = sc.Project
AND p.Contractor = sc.Contractor
WHERE p.Service = 'S2'
将向您展示执行S2服务以及S2以外的任何服务的所有承包商项目
另外,在我第一次学习时,这里有一个帮助我理解半联接(
存在
)和反半联接(不存在
)的好处。对简单的示例数据有效,但它不会总是找到只提供S2的承包商,即。,它不排除提供S2的承包商,也可能在同一项目中提供S1或S3。也许您需要进一步增强您的示例。所以我们知道你们真正想要的是什么。这个团体反对项目和承包商。它将为您提供单一承包商仅提供一项服务的项目。这不是你想要的吗?然后过滤器在S2服务上。还有什么我可以回答的吗?你能描述一下你从阅读我的问题到表达你的解决方案的思维过程吗?问题中的哪些关键因素导致您使用或设计该解决方案?知道你是如何处理这个问题来提高我的技能会很有帮助。所以,你从集合的角度来看这个问题。第一步,您确定了提供S2的所有承包商的集合。第二步,您从提供S2的set 1承包商中排除。也许您首先确定了最大的集合,然后通过减法(在本例中)或在其他情况下进行加法来确定最终的集合?我正在寻找一种方法,从读取问题到SQL解决方案。现在,我读了这个问题并思考了一下,当我遇到一个不熟悉的问题时,我感到很难堪,就像我贴在这里的那个问题,你很巧妙地解决了。关于设置基数,这是正确的。我希望我能分享我的整个思考过程,但解决方案刚刚从过去的斗争中出现,类似于你所面临的。这就是为什么这样的合作如此伟大。我们可以分享我们的经验、奋斗和解决方案。。。我们都因此而进步。
SELECT AllS2.[Project],
AllS2.[Contractor],
AllS2.[Service]
FROM [StackoverflowProjects] AllS2
WHERE AllS2.[Service] = 'S2'
AND NOT EXISTS (SELECT NULL
FROM StackoverflowProjects NonS2
WHERE AllS2.Project = NonS2.Project
AND AllS2.Contractor = NonS2.Contractor
AND AllS2.Service <> 'S2')
SELECT AllS2.[Project],
AllS2.[Contractor],
AllS2.[Service]
FROM [StackoverflowProjects] AllS2
WHERE AllS2.[Service] = 'S2'
AND EXISTS (SELECT NULL
FROM StackoverflowProjects NonS2
WHERE AllS2.Project = NonS2.Project
AND AllS2.Contractor = NonS2.Contractor
AND AllS2.Service <> 'S2')