在SQL表中的1个唯一赋值中使用相同的表查找两个显示名称

时间:2015-03-25 18:49:46

标签: mysql sql sql-server-2012 ms-project-server-2013

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

换句话说,对于每个任务,分配了资源和一个状态管理器。这会将SQl转换为Assignment,对于资源是唯一的,但具有相同的状态管理器。但是,数据库中的任何位置都无法在给定的分配上看到状态管理器的名称。

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

对于我的报告,问题是,我需要能够查看ResourceUID TaskstatusManagerUID并确定每个在同一作业上的名称。

虽然我已成功使用联接来显示其中一个名称,但我无法确定如何显示Resource和TaskStatusManager的名称。

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

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

查看以下详细信息:

enter image description here

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

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]

目前,我正在接受#34;从字符串转换为uniqueidentifier时转换失败。"

2 个答案:

答案 0 :(得分:0)

在您的加入时,您有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的性质,您可能无法将其转换/转换为char值,在这种情况下,您需要将两个字段转换/转换为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])

OR

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)

答案 1 :(得分:0)

感谢Jeff Beese额外的一双眼睛,这对我来说已经足够了![/ p>

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]