Hago este blog porque he buscado y buscado en internet y es muy dificil encontrar la solucion a este problema en ESPAÑOL, asi que empecemos
El siguiente ejemplo les muestra el problema que voy a resolver
select
distinct
pl.provider_id,
p.last_name as nombre,
p.first_name as apellido,
l.language_ud as idioma
from provider_language pl
left join language l on l.language_id=pl.language_id
left join provider p on p.provider_id=pl.provider_id
order by pl.provider_id
El cual genera el siguiente resultado:
Id nombre apellido idioma
----------- ----------------------------------- ----------------------------------- ---------------
5 NULL NULL PORTUGUESE
5 NULL NULL SPANISH
13 Caro Marjorie ENGLISH
13 Caro Marjorie SPANISH
16 Anders Aida SPANISH
18 Ventre Peter ENGLISH
18 Ventre Peter SPANISH
19 Iyer Krithika ENGLISH
19 Iyer Krithika TAMIL
20 Sobhan Tanveer BANGLA
20 Sobhan Tanveer BENGALI
20 Sobhan Tanveer ENGLISH
21 Segal Scott ENGLISH
Como podran ver, cada persona habla mas de un idioma, por ejemplo ID = 20 el cual maneja 3 idiomas.
La pregunta es:
como hacer para mostrar en columnas el ID=20 en donde cada columna muestre un idioma diferente SIN la necesidad de poner el ID del idioma? como hacer esto sin complicarse usando cursores o PIVOT?
Pues simplemente mediante query anidado haciendo uso de
ROW_NUMBER() over (partition by order by )
A continuacion el codigo:
select language_ud
from
(
select
distinct
pl2.provider_id,
l2.language_ud,
ROW_NUMBER() over (partition by pl2.provider_id order by l2.language_id ) as Row#
from provider_language pl2 left join language l2 on l2.language_id=pl2.language_id
group by pl2.provider_id, l2.language_id ,l2.language_ud
--order by pl2.provider_id, XXX
) ZZZ
where Row#=3 and provider_id=20
Lo que hace el código anterior es dividir los registros por persona luego le coloca un numero de row a cada registro por persona todo esto usando el partition by y el order by del ROW_COUNT. despues lo que hace el query es simplemente decirle cual de todos los idiomas nos interesa, en este caso yo le dije :
Row#=3 correspondiente a la persona provider_id=20
y el resultado de esto es :
ENGLISH
Eso es todo, cualquier pregunta relacionada al tema háganla que con gusto la respondo