[英]sql query get multiple values from same column for one row
如果每个员工都有多个联系方式,我将获得多行,但是我只希望每位员工列出他们的姓,名,部门名称,电子邮件和电话。
所以它应该像这样
First Name Last Name Division Email Phone
Test Guy Exec test@gmail.com 555-5555
这是我所拥有的,但不起作用:
SELECT sr.LastName, sr.FirstName, dd.Name,
Email = (select sc.ContactValue FROM StaffContactInformation as sc
INNER JOIN StaffRoster as roster on sc.StaffID = roster.ID
where sc.ContactTypeID = 3 and roster.ID = sr.ID),
Phone = (SELECT sc1.ContactValue FROM StaffContactInformation as sc1
INNER JOIN StaffRoster as roster on sc1.StaffID = roster.ID
where sc1.ContactTypeID = 1)
FROM StaffRoster as sr
left join dictDivisions as dd on sr.DivisionID = dd.Id
left join StaffContactInformation as sci on sr.ID = sci.StaffID
inner join dictStaffContactTypes as dsct on sci.ContactTypeID = dsct.ID
where (sr.Active = 1 and sr.isContractor = 0 )
ORDER BY sr.LastName, sr.FirstName
我用以下查询解决了它:
SELECT sr.LastName, sr.FirstName, dd.Name,
Email = (select sc.ContactValue FROM StaffContactInformation as sc
INNER JOIN StaffRoster as roster on sc.StaffID = roster.ID
where sc.ContactTypeID = 3 and roster.ID = sr.ID),
Phone = (SELECT sc.ContactValue FROM StaffContactInformation as sc
INNER JOIN StaffRoster as roster on sc.StaffID = roster.ID
where sc.ContactTypeID = 1 and roster.ID = sr.ID)
FROM StaffRoster as sr
left join dictDivisions as dd on sr.DivisionID = dd.Id
where (sr.Active = 1 and sr.isContractor = 0 )
ORDER BY sr.LastName, sr.FirstName
如果要在子查询中选择email
和phone
,则这两个联接可能是不必要的:
left join StaffContactInformation as sci on sr.ID = sci.StaffID
inner join dictStaffContactTypes as dsct on sci.ContactTypeID = dsct.ID
由于它们,您得到的行数与特定人的联系人一样多。
最终查询可能类似于:
SELECT sr.LastName, sr.FirstName, dd.Name,
Email = (
select sc.ContactValue FROM StaffContactInformation as sc
INNER JOIN StaffRoster as roster on sc.StaffID = roster.ID
where sc.ContactTypeID = 3 and roster.ID = sr.ID
),
Phone = (
SELECT sc1.ContactValue FROM StaffContactInformation as sc1
INNER JOIN StaffRoster as roster on sc1.StaffID = roster.ID
where sc1.ContactTypeID = 1
)
FROM StaffRoster as sr
left join dictDivisions as dd on sr.DivisionID = dd.Id
where (sr.Active = 1 and sr.isContractor = 0 )
ORDER BY sr.LastName, sr.FirstName
如果您正在运行SQL Server 2005+,则可以使用数据透视表。 在这里,我声明一个CTE来封装数据透视表,您可以使用该数据透视表加入其余的查询中:
;with ContactInfo( StaffId, Email, Phone )
as
(
select
sci.StaffID
, [3] Email
, [1] Phone
from
StaffContractInformation sci
PIVOT( MAX(ContactValue) for ContactTypeId in ( [3], [1] ) PivotTable
)
SELECT
sr.LastName,
sr.FirstName,
dd.Name,
ci.Email,
ci.Phone
FROM
StaffRoster as sr
left join dictDivisions as dd
on sr.DivisionID = dd.Id
left join ContactInfo ci
on sr.ID = ci.StaffID
-- inner join dictStaffContactTypes as dsct
--on sci.ContactTypeID = dsct.ID
where
sr.Active = 1
and sr.isContractor = 0
ORDER BY
sr.LastName,
sr.FirstName
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.