none
Es posible? Filas en columnas RRS feed

  • Pregunta

  • Buenas,

     Tengo una tabla de empleados y en esta tabla asigno las competencias que tiene cada uno por medio de campos, es decir

    ID	NOMBRE	ELECTRICIDAD	FONTANERIA	ALBAÑILERIA
    1	PABLO 	     1	             0	             0
    2	LUIS	     1	             1	             0 
    3	CARLOS	     0	             0	             1
    

    Una tabla así me resulta muy útil pero me trae bastante dolores de cabeza porque cada vez que tengo que incluir una competencia nueva me supone tener que crear un campo nuevo para esa competencia, modificar informes, modificar la capa de software, etc...

    He comenzado a realizarlo de otra forma, la tabla queda exclusiva para los datos de empleado e ID y en una nueva tabla, estoy guardando los datos por medio de registros :

    ID_EMP	COMPETENCIA
    1	ELECTRICIDAD
    2	ELECTRICIDAD
    2	FONTANERIA
    3	ALBAÑILERIA

    Pero por mas vueltas que le doy dentro de mis pocos conocimientos de sql server , no veo la forma de combinar las tablas de tal forma que me quede algo parecido a lo que tenia inicialmente.

    Algun comando/función para eso??

    Gracias

    viernes, 28 de abril de 2017 10:12

Respuestas

  • Hola que tal Mayoko, la funcion de SQL Server se llama PIVOT lo que hace es transformar las filas en columnas, si se te complica mucho cada vez que agreguen una competencia, lo que podrías hacer es un PIVOT DINAMICO.

    Aqui te paso un Link para que veas la logica PIVOT TABLE.

    Cualquier cosa nos consultas.

    Saludos,

    Jorge Muchaypiña G.


    Business Intelligence Analyst

    viernes, 28 de abril de 2017 10:35
  • Aqui te paso el ejemplo de un PIVOT DINAMICO, para que te facilite.

    use tempdb
    go
    --Creamos una tabla
    Create Table dbo.Ejemplos(
    CodPersona smallint identity(1,1) primary key,
    Persona nvarchar(35),
    Mes nvarchar(10),
    Monto decimal(5,2)
    )
    go
    
    --Insertamos unos registros en la tabla
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jameson','Enero',125.2)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Daniel','Febrero',35.5)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jorge','Enero',30.1)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Daniel','Marzo',55.8)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jorge','Abril',25.0)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jameson','Abril',30.1)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jameson','Enero',55.8)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jorge','Febrero',25.0)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Daniel','Enero',55.8)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jorge','Mayo',55.0)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Daniel','Mayo',20.8)
    
    --Pivot Estatico
    SELECT Persona,
    isnull(Enero,0) Enero,
    isnull(Febrero,0) Febrero,
    isnull(Marzo,0) Marzo,
    isnull(Abril,0) Abril
    FROM
    (
    SELECT Persona, Mes, Monto
    FROM dbo.Ejemplos) AS TablaDatos
    PIVOT
    (
    SUM(MONTO)
    FOR Mes in (Enero,Febrero,Marzo,Abril)
    ) as PivotTable
    
    
    
    --Pivot Dinamico
    declare @query varchar(4000)
    declare @columns varchar(2000)
    
    select
    @columns=STUFF((select Distinct'],['
    + mes from dbo.Ejemplos
    order by '],[' + mes for XML PATH('')),1,2,'')+']'
    SET @query='Select * from
    (
    SELECT Persona,Mes,Monto
    FROM dbo.Ejemplos
    )t
    PIVOT
    (
    --sumamos el valor a mostrar
    sum(Monto)
    --ponemos el nombre de la variable de columnas
    FOR Mes in ('+@Columns+')
    ) as PivotTable;
    '
    execute (@Query)

    Cualquier cosa nos comentas.

    Saludos,

    Jorge Muchaypiña G.


    Business Intelligence Analyst

    viernes, 28 de abril de 2017 10:37

Todas las respuestas

  • Hola que tal Mayoko, la funcion de SQL Server se llama PIVOT lo que hace es transformar las filas en columnas, si se te complica mucho cada vez que agreguen una competencia, lo que podrías hacer es un PIVOT DINAMICO.

    Aqui te paso un Link para que veas la logica PIVOT TABLE.

    Cualquier cosa nos consultas.

    Saludos,

    Jorge Muchaypiña G.


    Business Intelligence Analyst

    viernes, 28 de abril de 2017 10:35
  • Aqui te paso el ejemplo de un PIVOT DINAMICO, para que te facilite.

    use tempdb
    go
    --Creamos una tabla
    Create Table dbo.Ejemplos(
    CodPersona smallint identity(1,1) primary key,
    Persona nvarchar(35),
    Mes nvarchar(10),
    Monto decimal(5,2)
    )
    go
    
    --Insertamos unos registros en la tabla
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jameson','Enero',125.2)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Daniel','Febrero',35.5)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jorge','Enero',30.1)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Daniel','Marzo',55.8)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jorge','Abril',25.0)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jameson','Abril',30.1)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jameson','Enero',55.8)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jorge','Febrero',25.0)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Daniel','Enero',55.8)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Jorge','Mayo',55.0)
    Insert into dbo.Ejemplos(Persona, Mes, Monto) values('Daniel','Mayo',20.8)
    
    --Pivot Estatico
    SELECT Persona,
    isnull(Enero,0) Enero,
    isnull(Febrero,0) Febrero,
    isnull(Marzo,0) Marzo,
    isnull(Abril,0) Abril
    FROM
    (
    SELECT Persona, Mes, Monto
    FROM dbo.Ejemplos) AS TablaDatos
    PIVOT
    (
    SUM(MONTO)
    FOR Mes in (Enero,Febrero,Marzo,Abril)
    ) as PivotTable
    
    
    
    --Pivot Dinamico
    declare @query varchar(4000)
    declare @columns varchar(2000)
    
    select
    @columns=STUFF((select Distinct'],['
    + mes from dbo.Ejemplos
    order by '],[' + mes for XML PATH('')),1,2,'')+']'
    SET @query='Select * from
    (
    SELECT Persona,Mes,Monto
    FROM dbo.Ejemplos
    )t
    PIVOT
    (
    --sumamos el valor a mostrar
    sum(Monto)
    --ponemos el nombre de la variable de columnas
    FOR Mes in ('+@Columns+')
    ) as PivotTable;
    '
    execute (@Query)

    Cualquier cosa nos comentas.

    Saludos,

    Jorge Muchaypiña G.


    Business Intelligence Analyst

    viernes, 28 de abril de 2017 10:37