en

Tecnologia

Convirtiendo Registros en Columnas SQL Server 2005

Hola,

Estuve viendo algo acerca de las nuevas características de sql server 2005 y me encontré
con algo que permite mostrar registros como si fueran columnas, el operador PIVOT
El ejemplo trabajaba en la base de datos AdventureWorks, y es un poco complicado,
tal vez porque es una base de datos con la que uno no está familiarizado 100%, y cruzaba
tres tablas...
En fin, el texto era muy bueno y da a entender  muy bien el mensaje, pero me tomé el
trabajo de hacer mi propio ejemplo con solo dos tablas cruzadas para concentrase más
en el uso de este nuevo operador
la bd la llamé test1, pueden crearla manualmente, estas son las tablas: 

create table Cargo

(
ID int not null primary key identity(1,1),
Nombre varchar(50) not null,
Descripcion varchar(50)
)
create table Empleado
(
ID int not null primary key identity(1,1),
Nombre varchar(50) not null,
Sexo char(1) not null default('M'),
IDCargo int not null,
constraint FK_CARGO_EMP foreign key(IDCargo) references Cargo(ID),
constraint CHK_SEXO_EMP check (Sexo='M' or Sexo='F')
)


Ahora vamos a sacar un listado de todos los cargos y al lado de cada nombre de
cargo vamos a decir cuantos hombres y cuantas mujeres hay actualmente
desempeñandolo, el operador Pivot nos reduce mucho trabajo que
antes tocaba realizar
1- el ejemplo usaba una vista, yo lo hago con un CTE para no complicarse tanto


with EMP(ID_EMP,CARGO,SEXO) as(
select E.ID, C.Nombre,E.Sexo from Cargo C
left join Empleado E
on E.IDCargo=C.ID
)


2- Ahora con la consulta guardada en EMP, damos nombre a las columnas que vamos
a mostrar, además aparece pivot, el cual va a indicar que cuente los registros de la primera
consulta que tengan como sexo m y como sexo f y saque una
columna basada en esos valores

select CARGO,M AS 'No.HOMBRES',F AS 'No. MUJERES' from EMP
pivot
(
count(ID_EMP) for SEXO in(M,F)
) AS PVT

Comparen esta consulta con que haría un GROUP BY


select C.Nombre as CARGO,count(E.ID) as 'Numero de Empleados' from Cargo C
left join Empleado E on (E.IDCargo=C.ID)
group by C.Nombre

Por ultimo, intenté hacer lo mismo sin necesidad de la vista ni el CTE, pero la verdad
no pude, parece que se necesita de una vista, cte, procedimiento o función para que
esto funcione, si alguien me puede desmentir, se lo agradecería mucho...
Dijo un gran amigo... felices lineas de código!

Att. Espectro
Publicado ago 27 2007, 11:28 por admin
Archivado en: ,,,

Comentarios

Aún no ha hecho nadie ningún comentario. Escribe alguno y sé el primero :P
Copyright © 2003 - 2007 Célula Unicauca.NET.
Ofrecido por Community Server (Non-Commercial Edition)