Продукт базы данных и версия имеют все значение здесь.Предполагая, что вы используете что-то, поддерживающее функции ранжирования (например, SQL Server 2005 +)
Select FName, LName
, Min( Case When Rnk = 1 Then Z.Email End ) As Email1
, Min( Case When Rnk = 2 Then Z.Email End ) As Email2
From (
Select FName, LName, Email
, Row_Number() Over ( Partition By FName, LName Order By Id ) As Rnk
From MyTable
) As Z
Group By Z.FName, Z.LName
Если вы не используете продукт, поддерживающий функции ранжирования (например, MySQL), то это сложнее.Одним из решений, которое должно работать практически на всех системах баз данных, было бы:
Select FName, LName
, Min( Case When Rnk = 1 Then Z.Email End ) As Email1
, Min( Case When Rnk = 2 Then Z.Email End ) As Email2
From (
Select FName, LName, Email
, (Select Count(*)
From MyTable As T2
Where T1.FName = T2.FName
And T2.LName = T2.LName
And T2.Id < T1.Id) + 1 As Rnk
From MyTable As T1
) As Z
Group By Z.FName, Z.LName