查询排除在两列中找到的值
Query Excluding Values Found in Two Columns
我在论坛上找不到这个,更不知道如何描述它。
设置:
我有一个数据库,我在其中加入了很多包含人员、他们的任务和时间条目的表。这是一个平面视图,因此时间条目具有与其关联的属性,并且项目也具有其自己的属性。时间条目和项目都有与之关联的客户
问题:
我需要执行几个差异查询。此人不应负责未分配给他们的项目。我只想看那些。我 运行 面临的挑战是是否可以将此人分配给多个客户。表的连接方式在与时间条目数据连接后可能会产生误导。即:
Person | Assigned Customer | Time Entry Customer
Joe | Customer A | Customer C
Joe | Customer B | Customer C
Joe | Customer B | Customer A
在上面的示例输出中,应过滤掉第 1 行和第 3 行,因为 'Joe' 已分配给客户 A(第 1 行)并且正在向客户 A(第 3 行)收费。
我曾尝试执行 EXISTS 语句来过滤掉一些东西,但我无法理解语法(我知道结果与我在下面的查询中没有 EXISTS 子句时的结果相同) :
SELECT A.[Assigned Engineer]
,YEAR(A.[Date]) AS [Year]
,dbo.ISOweek(A.[Date]) AS [Week]
,A.[Customer] AS [Charging Customer]
,A.[Project Customer] AS [Project Customer]
,SUM(A.[Hours]) AS [Hours]
FROM SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD A
WHERE A.[Customer] NOT LIKE '%' + A.[Project Customer] +'%'
AND YEAR(A.[Date])=2015
AND dbo.ISOweek(A.[Date])=1
AND EXISTS
(SELECT B.[Assigned Engineer]
,YEAR(B.[Date]) AS [Year]
,dbo.ISOweek(A.[Date]) AS [Week]
,B.[Customer] AS [Charging Customer]
,B.[Project Customer] AS [Project Customer]
,SUM(B.[Hours]) AS [Hours]
FROM SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD B
WHERE A.[Assigned Engineer]=B.[Assigned Engineer]
AND A.[Customer] NOT LIKE '%' + B.[Project Customer] +'%'
GROUP BY B.[Assigned Engineer], YEAR(B.[Date]), dbo.ISOweek(B.[Date]), B.[Customer], B.[Project Customer]
)
GROUP BY A.[Assigned Engineer], YEAR(A.[Date]), dbo.ISOweek(A.[Date]), A. [Customer], A.[Project Customer]
ORDER BY A.[Assigned Engineer]
如有任何帮助,我们将不胜感激!
编辑 - 2015 年 2 月 27 日
这里是一些请求的示例数据:
Assigned Engineer | Date | Charging Customer | Project Customer | Hours
Joe | 1/4/2015 | Customer A - EAST | Customer A | 8
Joe | 1/4/2015 | Customer B | Customer A | 16
Joe | 1/4/2015 | Customer A - EAST | Customer C | 8
Joe | 1/4/2015 | Customer B | Customer C | 16
这可以通过左连接来解决吗?在我的加入中,我正在查看与指定客户匹配的行与与项目客户相同的客户的行。然后,在我的 where 子句中,我只撤回未找到匹配项的行。
SELECT A.[Assigned Engineer]
,YEAR(A.[Date]) AS [Year]
,dbo.ISOweek(A.[Date]) AS [Week]
,A.[Customer] AS [Charging Customer]
,A.[Project Customer] AS [Project Customer]
,SUM(A.[Hours]) AS [Hours]
FROM SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD A
left outer join SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD B
ON A.[Assigned Engineer] = B.[Assigned Engineer] AND
(B.[Customer] LIKE A.[Project Customer] + '%' = OR A.[Customer] LIKE B.[Project Customer] + '%')
WHERE b.[Customer] IS NULL
编辑:更改连接以反映 OP 的数据。
我相信我已经回答了我自己的问题...我的前额只需要到达墙上的石膏板 :) 我知道这会很简单,但我无法足够快地到达那里。使用 COUNT 和子查询,我能够过滤掉收费客户与指定客户相似的所有记录。我希望这能够在未来帮助其他人:
SELECT A.[Assigned Engineer]
,YEAR(A.[Date]) AS [Year]
,dbo.ISOweek(A.[Date]) AS [Week]
,A.[Customer] AS [Charging Customer]
,A.[Project Customer] AS [Project Customer]
,A.[Hours]
FROM SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD A
WHERE A.[Customer] NOT LIKE '%' + A.[Project Customer] + '%'
AND 1>(SELECT COUNT(*)
FROM SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD B
WHERE A.[Assigned Engineer]=B.[Assigned Engineer]
AND YEAR(A.[Date])=YEAR(B.[Date])
AND dbo.ISOweek(A.[Date])=dbo.ISOweek(B.[Date])
AND A.[Customer] LIKE '%' + B.[Project Customer] + '%'
AND A.[Hours]=B.[Hours])
ORDER BY A.[Assigned Engineer]
,YEAR(A.[Date])
,dbo.ISOweek(A.[Date])
我在论坛上找不到这个,更不知道如何描述它。
设置: 我有一个数据库,我在其中加入了很多包含人员、他们的任务和时间条目的表。这是一个平面视图,因此时间条目具有与其关联的属性,并且项目也具有其自己的属性。时间条目和项目都有与之关联的客户
问题: 我需要执行几个差异查询。此人不应负责未分配给他们的项目。我只想看那些。我 运行 面临的挑战是是否可以将此人分配给多个客户。表的连接方式在与时间条目数据连接后可能会产生误导。即:
Person | Assigned Customer | Time Entry Customer
Joe | Customer A | Customer C
Joe | Customer B | Customer C
Joe | Customer B | Customer A
在上面的示例输出中,应过滤掉第 1 行和第 3 行,因为 'Joe' 已分配给客户 A(第 1 行)并且正在向客户 A(第 3 行)收费。
我曾尝试执行 EXISTS 语句来过滤掉一些东西,但我无法理解语法(我知道结果与我在下面的查询中没有 EXISTS 子句时的结果相同) :
SELECT A.[Assigned Engineer]
,YEAR(A.[Date]) AS [Year]
,dbo.ISOweek(A.[Date]) AS [Week]
,A.[Customer] AS [Charging Customer]
,A.[Project Customer] AS [Project Customer]
,SUM(A.[Hours]) AS [Hours]
FROM SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD A
WHERE A.[Customer] NOT LIKE '%' + A.[Project Customer] +'%'
AND YEAR(A.[Date])=2015
AND dbo.ISOweek(A.[Date])=1
AND EXISTS
(SELECT B.[Assigned Engineer]
,YEAR(B.[Date]) AS [Year]
,dbo.ISOweek(A.[Date]) AS [Week]
,B.[Customer] AS [Charging Customer]
,B.[Project Customer] AS [Project Customer]
,SUM(B.[Hours]) AS [Hours]
FROM SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD B
WHERE A.[Assigned Engineer]=B.[Assigned Engineer]
AND A.[Customer] NOT LIKE '%' + B.[Project Customer] +'%'
GROUP BY B.[Assigned Engineer], YEAR(B.[Date]), dbo.ISOweek(B.[Date]), B.[Customer], B.[Project Customer]
)
GROUP BY A.[Assigned Engineer], YEAR(A.[Date]), dbo.ISOweek(A.[Date]), A. [Customer], A.[Project Customer]
ORDER BY A.[Assigned Engineer]
如有任何帮助,我们将不胜感激!
编辑 - 2015 年 2 月 27 日
这里是一些请求的示例数据:
Assigned Engineer | Date | Charging Customer | Project Customer | Hours
Joe | 1/4/2015 | Customer A - EAST | Customer A | 8
Joe | 1/4/2015 | Customer B | Customer A | 16
Joe | 1/4/2015 | Customer A - EAST | Customer C | 8
Joe | 1/4/2015 | Customer B | Customer C | 16
这可以通过左连接来解决吗?在我的加入中,我正在查看与指定客户匹配的行与与项目客户相同的客户的行。然后,在我的 where 子句中,我只撤回未找到匹配项的行。
SELECT A.[Assigned Engineer]
,YEAR(A.[Date]) AS [Year]
,dbo.ISOweek(A.[Date]) AS [Week]
,A.[Customer] AS [Charging Customer]
,A.[Project Customer] AS [Project Customer]
,SUM(A.[Hours]) AS [Hours]
FROM SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD A
left outer join SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD B
ON A.[Assigned Engineer] = B.[Assigned Engineer] AND
(B.[Customer] LIKE A.[Project Customer] + '%' = OR A.[Customer] LIKE B.[Project Customer] + '%')
WHERE b.[Customer] IS NULL
编辑:更改连接以反映 OP 的数据。
我相信我已经回答了我自己的问题...我的前额只需要到达墙上的石膏板 :) 我知道这会很简单,但我无法足够快地到达那里。使用 COUNT 和子查询,我能够过滤掉收费客户与指定客户相似的所有记录。我希望这能够在未来帮助其他人:
SELECT A.[Assigned Engineer]
,YEAR(A.[Date]) AS [Year]
,dbo.ISOweek(A.[Date]) AS [Week]
,A.[Customer] AS [Charging Customer]
,A.[Project Customer] AS [Project Customer]
,A.[Hours]
FROM SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD A
WHERE A.[Customer] NOT LIKE '%' + A.[Project Customer] + '%'
AND 1>(SELECT COUNT(*)
FROM SkyNet.dbo.PROJECT_ASSIGNMENT_AND_CHARGES_DASHBOARD B
WHERE A.[Assigned Engineer]=B.[Assigned Engineer]
AND YEAR(A.[Date])=YEAR(B.[Date])
AND dbo.ISOweek(A.[Date])=dbo.ISOweek(B.[Date])
AND A.[Customer] LIKE '%' + B.[Project Customer] + '%'
AND A.[Hours]=B.[Hours])
ORDER BY A.[Assigned Engineer]
,YEAR(A.[Date])
,dbo.ISOweek(A.[Date])