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