Puede utilizar un CTE para recoger los datos, mientras que la rotación de los números de teléfono en una lista separada por comas. Puede que no sea eficiente, pero es un truco útil.
Los siguientes carreras y AdventureWorks2008R2, aunque tendrá que rellenar algunos datos adicionales en la tabla Person.PersonPhone para crear varios números de teléfono para un solo tipo de persona/número.
; with PersonsWithTelephoneNumbersCTE (
BusinessEntityId, FirstName, MiddleName, LastName,
PhoneNumberTypeId, PhoneNumber, PhoneNumbers, Elements)
as (
-- Base case: Just the person identifications with all possible phone types.
select BusinessEntityID, FirstName, MiddleName, LastName, PhoneNumberTypeId,
cast('' as NVarChar(25)), cast('' as VarChar(MAX)), 0
from Person.Person as PP cross join
Person.PhoneNumberType as PNT
union all
-- Add a telephone number.
select CTE.BusinessEntityId, CTE.FirstName, CTE.MiddleName, CTE.LastName,
PNT.PhoneNumberTypeID, PN.PhoneNumber,
cast(CTE.PhoneNumbers + ', ' + PN.PhoneNumber as VarChar(MAX)), CTE.Elements + 1
from PersonsWithTelephoneNumbersCTE as CTE inner join
Person.Person as PP on PP.BusinessEntityID = CTE.BusinessEntityId inner join
Person.PhoneNumberType as PNT on PNT.PhoneNumberTypeID = CTE.PhoneNumberTypeId inner join
Person.PersonPhone as PN on PN.BusinessEntityID = CTE.BusinessEntityId and PN.PhoneNumberTypeID = PNT.PhoneNumberTypeID
where PN.PhoneNumber > CTE.PhoneNumber
)
-- Get the person and the longest list of phone numbers for each person/phone type.
select LastName, FirstName, MiddleName,
(select Name from Person.PhoneNumberType where PhoneNumberTypeID = Edna.PhoneNumberTypeID) as PhoneNumberType,
substring(PhoneNumbers, 3, len(PhoneNumbers) - 2) as PhoneNumbers from (
select BusinessEntityID, FirstName, MiddleName, LastName, PhoneNumberTypeId, PhoneNumbers,
rank() over (partition by BusinessEntityId, PhoneNumberTypeId order by Elements desc) as Ranking
from PersonsWithTelephoneNumbersCTE
) as Edna
where Ranking = 1 and PhoneNumbers <> ''
order by LastName, FirstName, MiddleName, PhoneNumberType
No entiendo lo que está preguntando. ¿Podrías reformularlo? –
Fuera de tema: lo que estás preguntando es posible. En primer lugar, ¿esto es consumido por una aplicación .NET? Lo pregunto porque sería mucho más limpio hacer la transposición en LINQ –
@Neil Fenwick Sí, eso es correcto. ¿Podría explicar por favor cómo hago esto usando LINQ? – Shahin