Sql server 从一组行中只选择一行返回?
我正在使用AdventureWork2012数据库练习SQL,并创建了一个员工信息表。这是我的查询和结果Sql server 从一组行中只选择一行返回?,sql-server,tsql,Sql Server,Tsql,我正在使用AdventureWork2012数据库练习SQL,并创建了一个员工信息表。这是我的查询和结果 SELECT [e].[BusinessEntityID] , [e].[JobTitle] , CONCAT (p.FirstName, ' ', p.LastName) AS Full_Name , dep.Name AS Department
SELECT
[e].[BusinessEntityID]
, [e].[JobTitle]
, CONCAT (p.FirstName, ' ', p.LastName) AS Full_Name
, dep.Name AS Department
, DATENAME(dw, edh.StartDate) + ', ' +
DATENAME(month, edh.StartDate) + ' ' +
DATENAME(day, edh.StartDate) + ', ' +
DATENAME(year, edh.StartDate) AS 'Start_Date'
, CASE
WHEN edh.EndDate IS NULL
THEN CONVERT(VARCHAR, GETDATE(), 101)
ELSE edh.EndDate
END AS End_Date
, IIF(LEFT(pp.PhoneNumber, 3) = '1 (', ' ', LEFT(pp.PhoneNumber, 3)) AS Area_Code
, eph.Rate
, CASE CONVERT(CHAR(10), eph.PayFrequency)
WHEN 2 THEN 'Biweekly'
ELSE 'Weekly'
END AS PayFrequency
, IIF(e.SalariedFlag = 1, 'Y', 'N') AS 'SalaryEmployee'
, CASE
WHEN e.SalariedFlag = 1
THEN ROUND((eph.Rate*40)*52, 2)
ELSE NULL
END AS YearlySalary
--INTO EmpInfo
FROM [HumanResources].[Employee] AS e
INNER JOIN [HumanResources].[EmployeeDepartmentHistory] AS edh
ON edh.BusinessEntityID = e.BusinessEntityID
INNER JOIN [Person].[Person] AS p
ON p.BusinessEntityId = e.BusinessEntityID
INNER JOIN [Person].[PersonPhone] AS pp
ON pp.BusinessEntityID = e.BusinessEntityID
INNER JOIN [HumanResources].[Department] AS dep
ON dep.DepartmentID = edh.DepartmentID
INNER JOIN [HumanResources].[EmployeePayHistory] AS eph
ON eph.BusinessEntityID = e.BusinessEntityID
ORDER BY e.BusinessEntityID;
正如你所看到的,罗布·沃尔特斯被列入名单6次,因为他作为一名员工获得了3次加薪,并且是两个部门的一员。有没有办法让我只返回Rob Walter所在的两个部门的最新/最高小时工资?类似的情况应该非常接近。我删除了日期的格式,因为它真正属于前端。此外,您不希望将字符串文字用作列别名。它令人困惑,在sql server 2016中被弃用
像这样的东西应该很接近。我删除了日期的格式,因为它真正属于前端。此外,您不希望将字符串文字用作列别名。它令人困惑,在sql server 2016中被弃用
当然这很简单。您可以使用哪一列定义订单?开始日期?此外,您确实不应该在查询中设置日期格式。将格式保留在前端。@SeanLange因此我按
BusinessEntityID
对整个表进行排序,但是如果ID有重复的行,例如Rob Walters,我想我们可以使用Rate
列来定义顺序?这样我们就可以取最大值,这很简单。您可以使用哪一列定义订单?开始日期?此外,您确实不应该在查询中设置日期格式。将格式保留在前端。@SeanLange因此我按BusinessEntityID
对整个表进行排序,但是如果ID有重复的行,例如Rob Walters,我想我们可以使用Rate
列来定义顺序?这样我们就可以取最大值了谢谢。但有没有办法让两个部门的员工以最高的小时工资排成两行呢?当你的方法工作时,Rob Walter的工具设计行消失了。当然,只需在window函数的PARTITION BY子句中添加另一列即可。“按e.BusinessEntityID划分,e.Department”好的。谢谢,谢谢。但有没有办法让两个部门的员工以最高的小时工资排成两行呢?当你的方法工作时,Rob Walter的工具设计行消失了。当然,只需在window函数的PARTITION BY子句中添加另一列即可。“按e.BusinessEntityID划分,e.Department”好的。非常感谢。
BusinessEntityID JobTitle Full_Name Department Start_Date End_Date Area_Code Rate PayFrequency SalaryEmployee YearlySalary
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 Chief Executive Officer Ken Sánchez Executive Saturday, February 15, 2003 2019-11-08 697 125.50 Biweekly Y 261040.00
2 Vice President of Engineering Terri Duffy Engineering Sunday, March 3, 2002 2019-11-08 819 63.4615 Biweekly Y 131999.92
3 Engineering Manager Roberto Tamburello Engineering Wednesday, December 12, 2001 2019-11-08 212 43.2692 Biweekly Y 89999.94
4 Senior Tool Designer Rob Walters Engineering Saturday, January 5, 2002 2004-06-30 612 8.62 Biweekly N NULL
4 Senior Tool Designer Rob Walters Engineering Saturday, January 5, 2002 2004-06-30 612 23.72 Biweekly N NULL
4 Senior Tool Designer Rob Walters Engineering Saturday, January 5, 2002 2004-06-30 612 29.8462 Biweekly N NULL
4 Senior Tool Designer Rob Walters Tool Design Thursday, July 1, 2004 2019-11-08 612 8.62 Biweekly N NULL
4 Senior Tool Designer Rob Walters Tool Design Thursday, July 1, 2004 2019-11-08 612 23.72 Biweekly N NULL
4 Senior Tool Designer Rob Walters Tool Design Thursday, July 1, 2004 2019-11-08 612 29.8462 Biweekly N NULL
5 Design Engineer Gail Erickson Engineering Wednesday, February 6, 2002 2019-11-08 849 32.6923 Biweekly Y 67999.98
select *
from
(
SELECT
[e].[BusinessEntityID]
, [e].[JobTitle]
, CONCAT (p.FirstName, ' ', p.LastName) AS Full_Name
, dep.Name AS Department
, Start_Date = isnull(edh.StartDate, getdate())
, End_Date = isnull(edh.EndDate, getdate())
, IIF(LEFT(pp.PhoneNumber, 3) = '1 (', ' ', LEFT(pp.PhoneNumber, 3)) AS Area_Code
, eph.Rate
, CASE CONVERT(CHAR(10), eph.PayFrequency)
WHEN 2 THEN 'Biweekly'
ELSE 'Weekly'
END AS PayFrequency
, IIF(e.SalariedFlag = 1, 'Y', 'N') AS SalaryEmployee
, CASE
WHEN e.SalariedFlag = 1
THEN ROUND((eph.Rate*40)*52, 2)
ELSE NULL
END AS YearlySalary
, RowNum = ROW_NUMBER()over(partition by e.BusinessEntityID order by edh.StartDate desc) --or whatever column makes sense here
--INTO EmpInfo
FROM [HumanResources].[Employee] AS e
INNER JOIN [HumanResources].[EmployeeDepartmentHistory] AS edh
ON edh.BusinessEntityID = e.BusinessEntityID
INNER JOIN [Person].[Person] AS p
ON p.BusinessEntityId = e.BusinessEntityID
INNER JOIN [Person].[PersonPhone] AS pp
ON pp.BusinessEntityID = e.BusinessEntityID
INNER JOIN [HumanResources].[Department] AS dep
ON dep.DepartmentID = edh.DepartmentID
INNER JOIN [HumanResources].[EmployeePayHistory] AS eph
ON eph.BusinessEntityID = e.BusinessEntityID
) x
where x.RowNum = 1
ORDER BY x.BusinessEntityID;