在 SQL Tables 中的 1 个唯一分配中使用相同的 Table 查找两个显示名称

Lookup two Display Names using the same Table on 1 unique assignment in SQL Tables

我正在尝试编写一个查询,其中两个不同的 UID 需要分别为两者查找资源名称。

换句话说,对于每个任务,分配有资源和一个状态管理器。这会在 SQl 中转换为资源唯一的分配,但具有相同的状态管理器。但是,在数据库中的任何地方都看不到给定分配的状态经理姓名。

作业确实有 "TaskStatusManagerUID" 可用。状态管理器的名称可以通过将其绑定回 MSP_EPMResource table 来确定,其中 TaskStatusManagerUID = ResourceUID.

要点是,对于我的报告,我需要能够查看 ResourceUID TaskstatusManagerUID 并确定每个任务的名称。

虽然我已成功连接以显示一个或另一个的名称,但我无法确定如何显示 Resource 和 TaskStatusManager 的名称。

这是我要显示的示例(添加括号是为了便于阅读):

(AssignmentUID) (任务名称) (资源名称) (任务状态管理器名称)

查看以下更多信息:

这是我一直在使用的代码,但没有成功:

Select top 100
c.[assignmentuid], 
a.[taskname], 
c.[resourceuid],
b.[resourcename], 
a.[taskstatusmanageruid],
d.[StatusManager]

from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmAssignment] c
join [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmTask_UserView] a
on a.[TaskUID] = c.[TaskUID]
join [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b
on b.[ResourceUID] = c.[ResourceUID]

join (select b.resourcename StatusManager
from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b) d 
on d.[StatusManager] = a.[taskstatusmanageruid] 

group by 
c.[assignmentuid], 
a.[taskname], 
c.[resourceuid],
b.[resourcename], 
a.[taskstatusmanageruid],
d.[StatusManager]

目前,我得到 "Conversion failed when converting from a character string to uniqueidentifier."

在您的联接中,您有 on a.[TaskUID] = c.[TaskUID]on b.[ResourceUID] = c.[ResourceUID]on d.[StatusManager] = a.[taskstatusmanageruid],其中,我假设最后一个导致了您的问题。试试看

join (select b.resourcename StatusManager
from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b) d 
on d.[StatusManager] = CONVERT(CHAR, a.[taskstatusmanageruid])

这会将 taskstatusmanageruid 中包含的 GUID 转换为 char 字符串,使其能够成功比较。

您也可以不转换值,而是转换值 CAST(a.[taskstatusmanageruid] AS CHAR

编辑

由于 GUID 的性质,您可能无法将其 convert/cast 转换为 char 值,在这种情况下,您需要将两个字段 convert/cast 转换为 varchar 或 nvarchar:

join (select b.resourcename StatusManager
from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b) d 
on CONVERT([N]VARCHAR, d.[StatusManager]) = CONVERT([N]VARCHAR, a.[taskstatusmanageruid])

join (select b.resourcename StatusManager
from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b) d 
on CAST(d.[StatusManager] AS [N]VARCHAR) = CAST( a.[taskstatusmanageruid] AS [N]VARCHAR)

多亏了 Jeff Beese 的双眼,我才把最后一块拼好!

Select top 100
c.[assignmentuid], 
a.[taskname], 
c.[resourceuid],
b.[resourcename], 
a.[taskstatusmanageruid],
d.[StatusManager]

from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmAssignment] c
join [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmTask_UserView] a
on a.[TaskUID] = c.[TaskUID]
join [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b
on b.[ResourceUID] = c.[ResourceUID]

join (select b.resourcename as StatusManager, 
             b.ResourceUID 
from [PRJPROD_ProjectWebApp].[dbo].[MSP_EpmResource] b) d 
on d.[resourceuid] = a.[taskstatusmanageruid]


group by 
c.[assignmentuid], 
a.[taskname], 
c.[resourceuid],
b.[resourcename], 
a.[taskstatusmanageruid],
d.[StatusManager]