Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 如何从sql查询中获取批准人的姓名_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql server 如何从sql查询中获取批准人的姓名

Sql server 如何从sql查询中获取批准人的姓名,sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有两个Sql Server 2012表,“Person”和“Report”。各表的说明如下所示: |ReportID|ReportName|ExecutiveApproved|ManagerApproved|StaffApproved|LegalApproved|AccountingApproved|CreatedBy|CreatedDate 人员表(列名:数据类型): 注:Person表中的“前缀”列指另一个名为“支持类别”的表;此数值对应于“先生”、“女士”等 报表表(列名:数据类型):

我有两个Sql Server 2012表,“Person”和“Report”。各表的说明如下所示:

|ReportID|ReportName|ExecutiveApproved|ManagerApproved|StaffApproved|LegalApproved|AccountingApproved|CreatedBy|CreatedDate
人员表(列名:数据类型):

注:Person表中的“
前缀
”列指另一个名为“
支持类别
”的表;此数值对应于“先生”、“女士”等

报表表(列名:数据类型):

您能指定我需要的查询,以“
执行批准、管理批准、staffaproved、法律批准、会计批准和CreatedBy
”的格式获取全名吗?预期结果如下所示:

|ReportID|ReportName|ExecutiveApproved|ManagerApproved|StaffApproved|LegalApproved|AccountingApproved|CreatedBy|CreatedDate
只是一个简单的连接:

select r.ReportID,
       r.ReportName,
       p1.LastName + ' ' + ISNULL(c1.Suffix, '') + ', ' + c1.Code + ' ' + p1.FirstName as ExecutiveApproved,
       p2.LastName + ' ' + ISNULL(c2.Suffix, '') + ', ' + c2.Code + ' ' + p2.FirstName as ManagerApproved,
       p3.LastName + ' ' + ISNULL(c3.Suffix, '') + ', ' + c3.Code + ' ' + p3.FirstName as StaffApproved,
       p4.LastName + ' ' + ISNULL(c4.Suffix, '') + ', ' + c4.Code + ' ' + p4.FirstName as LegalApproved,
       p5.LastName + ' ' + ISNULL(c5.Suffix, '') + ', ' + c5.Code + ' ' + p5.FirstName as AccountingApproved,
       r.CreatedBy,
       r.CreatedDate 
from reports r
left join persons p1 on r.ExecutiveApproved = p1.PersonID
left join persons p2 on r.ManagerApproved = p2.PersonID
left join persons p3 on r.StaffApproved = p3.PersonID
left join persons p4 on r.LegalApproved= p4.PersonID
left join persons p5 on r.AccountingApproved = p5.PersonID
left join SupportCategory c1 on p1.Prefix = c1.Prefix 
left join SupportCategory c2 on p2.Prefix = c2.Prefix 
left join SupportCategory c3 on p3.Prefix = c3.Prefix 
left join SupportCategory c4 on p4.Prefix = c4.Prefix 
left join SupportCategory c5 on p5.Prefix = c5.Prefix 

基本上,您必须执行一系列从报表表到Person的连接,每个要转换为名称的列对应一个连接。使用左联接,因为Person的每个联接副本将只匹配其中一列。为了多次加入同一个表,必须为其添加别名。然后使用别名选择名称。基本形式如下:

SELECT ReportID, ReportName, 
  (executive.LastName + ' ' + ISNULL([executive.Suffix], '') + ', ' + executive.Prefix + ' ' + executive.FirstName) AS ExecutiveName, 
  <repeat for each of the other columns>
  FROM Report
  LEFT JOIN Person as executive ON Person.id = Report.ExecutiveApproved
  <repeat for each of the other columns>
选择ReportID、ReportName、,
(executive.LastName+''+ISNULL([executive.Suffix],'')+,'+executive.Prefix+''+executive.FirstName)作为ExecutiveName,
来自报告
在Person.id=Report.ExecutiveApproved上以执行官的身份左加入Person

我尝试了Giorgi的方法,但我收到了以下错误:Msg 245,16级,状态1,第2行在将varchar值“”转换为数据类型int时失败。@PublicTechie2015,是的,prefixcategory中应该有一些代码列,我已经编辑过。Giorgi,我想我解决了我遇到的错误。我正在测试,乔治,你的解决方案很好用。感谢您的帮助:-)备注:您有许多字段,如[xxxApproved]。这使它变得复杂,将来需要新类型时,您可能会遇到问题。您可以通过创建一个单独的表来改进您的设计,该表包含ReportID、PersonID、FunctionID,然后FunctionID将链接到Executive、Manager等。这样,您就更加灵活,查询也更加方便。
SELECT ReportID, ReportName, 
  (executive.LastName + ' ' + ISNULL([executive.Suffix], '') + ', ' + executive.Prefix + ' ' + executive.FirstName) AS ExecutiveName, 
  <repeat for each of the other columns>
  FROM Report
  LEFT JOIN Person as executive ON Person.id = Report.ExecutiveApproved
  <repeat for each of the other columns>