martes, 26 de febrero de 2013

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