Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 查找在每个项目中仅提供服务2的承包商_Sql Server_Sql Server 2005 - Fatal编程技术网

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