¿Buscas alumnos? Entra y promociona tus cursos
¿Buscas formación? Entra o regístrate
Cursos   Masters   Universidades   Cursos Gratis   Oposiciones   Subvencionados   Formación Profesional   Foros    
     Otras búsquedas
 Home > Informática > Bases de Datos > B. de Datos - Más Temáticas >Foro de SQL Server
Foro de SQL Server ------
Foro de SQL Server ------
  
A1
 
  Mensajes 1-7 de 7


Tema creado el 3 de Septiembre 2008

Datos Verticales a Datos Horizontales

     
Agradecer
 
Cajina
3 mensajes
Rango: Novato

Tengo estos valores

ID NOMBRE_CALIFICATIVO VALOR_CALIFICATIVO
363 BASELICOR TEQUILA
363 MATERIALENVASE ALUMINIO
363 PAQUETE N/A
363 SABOR TEQUILA
363 SUBMARCA ARTIC BAY
363 TIPOENVASE LATA
363 TIPOFERTA N/A
363 TIPOPAQUETE UNIDAD
364 BASELICOR VODKA
364 MATERIALENVASE ALUMINIO
364 PAQUETE N/A
364 SABOR CEREZA
364 SUBMARCA ARTIC BAY
364 TIPOENVASE LATA
364 TIPOFERTA N/A
364 TIPOPAQUETE UNIDAD

Pero quiero que sean desplegados de la manera siguiente:

ID BASELICOR MATERIALENVASE PAQUETE SABOR SUBMARCA TIPOENVASE TIPOFERTA TIPOPAQUETE
363 TEQUILA ALUMINIO N/A TEQUILA ARTIC BAY LATA N/A UNIDAD
364 VODKA ALUMINIO N/A CEREZA ARTIC BAY LATA N/A UNIDAD

Hice una funcion pero esta necesitaba un fetch y un sp_executesql pero parece que no se puede ejecutar sp_executesql dentro de una funcion.

Alguien sabe como podria ejecutar algo como esto sin usar sp_executesql:

Declare @calificativo varchar(200);

 

Declare @query nvarchar(700);

 

 

Insert @RTD_Horizontal

 

(ID)

 

Select Distinct ID

 

From dbo.RTD_Vertical;

 

 

Open nombrecalificativo;

 

Fetch NEXT from nombrecalificativo into @calificativo;

 

 

While @@FETCH_STATUS = 0

 

begin

 

 

Set @query=

 

            "Update @RTD_Horizontal " +

 

            "set " + @calificativo + " = v.VALOR_CALIFICATIVO " +

 

            "from dbo.RTD_Vertical v " +

 

            "inner join " +

 

            "@RTD_Horizontal t " +

 

            "on " +

 

            "v.ID = t.ID " +

 

            "where v.NOMBRE_CALIFICATIVO = """ + @calificativo + """;";

 

Exec sp_executesql @query;

 

 

Fetch NEXT from nombrecalificativo into @calificativo;

 

end;

 

 
¿Abuso?. Publicidad, ilegal, contenido, ofensivo, ...
¿Responde a tu pregunta?
Cierra este tema  Cierra este tema    Borrar tema Borrar tema   
Enviar a un amigo  Envía a un amigo
Experto de Foros
Isaías
Experto en SQL Server.
1687 mensajes
Rango: Posteador habitual
     
Agradecer
El 4 de Septiembre 2008
Year     Quarter     Amount
   -------------------------------

   1995     1           125,000.90
   1995     2           136,000.75
   1995     3           212,000.34
   1995     4           328,000.82
   1996     3           728,000.35
   1996     2           422,000.13
   1996     1           328,000.82

   YEAR        Q1              Q2              Q3              Q4
   -------------------------------------------------------------------

   1995     125,000.90      136,000.75      212,000.34      328,000.82
   1996     328,000.82      422,000.13      728,000.35            0.00
SELECT YEAR,
       Q1= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 1 AND YEAR =
  Q.YEAR),0),
       Q2= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 2 AND YEAR =
  Q.YEAR),0),
       Q3= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 3 AND YEAR =
  Q.YEAR),0),
       Q4= ISNULL((SELECT AMOUNT FROM QTRSALES WHERE QUARTER = 4 AND YEAR =
  Q.YEAR),0)
     FROM QTRSALES Q
     GROUP BY YEAR
Ahora que si tu base es 2005, consulta PIVOT

Agradecimientos recibidos:
Costa rica(1) 

¿Responde a tu pregunta?
Cajina
3 mensajes
Rango: Novato
     
Agradecer
El 4 de Septiembre 2008

Está excelente, me sirvió mucho el ejemplo, la consulta sale rápidamente. Pero vieras que usando el PIVOT nunca funcionó, yo uso SQL Server 2005, y había leído sobre el PIVOT y lo puse en práctica pero parece que no fue lo indicado.  

De hecho, te adjunto el código, lo he revisado muchas veces y veo que esta bien, no encuentro ningún error en él, talvez puedas ayudarme por que realmente preferiría usar el PIVOT.  

 

SELECT  

ID,  

[SUBMARCA] as SUBMARCA,  

[BASELICOR] as BASELICOR,  

[SABOR] as SABOR,  

[TIPOENVASE] as TIPOENVASE,  

[MATERIALENVASE] as MATERIALENVASE,  

[TIPOPAQUETE] as TIPOPAQUETE,  

[PAQUETE] as PAQUETE,  

[TIPOFERTA] as TIPOFERTA  

FROM  

(  

SELECT ID, NOMBRE_CALIFICATIVO, VALOR_CALIFICATIVO  

FROM dbo.vw_RTD_Vertical  

) p  

PIVOT  

(   

VALOR_CALIFICATIVO FOR NOMBRE_CALIFICATIVO IN  

([SUBMARCA],  

[BASELICOR],  

[SABOR],  

[TIPOENVASE],  

[MATERIALENVASE],  

[TIPOPAQUETE],  

[PAQUETE],  

[TIPOFERTA] )  

) AS n;


Muchar Gracias por la ayuda, no sabe cuanto se lo agradezco.
 


¿Abuso?. Publicidad, ilegal, contenido, ofensivo, ...
¿Responde a tu pregunta?
Experto de Foros
Isaías
Experto en SQL Server.
1687 mensajes
Rango: Posteador habitual
     
Agradecer
El 4 de Septiembre 2008
Comparalo contra tu codigo, Saludos
CREATE TABLE dbo.SalesByQuarter
(   Y INT,
    Q INT,
    sales INT,
    PRIMARY KEY (Y,Q)
)
GO
 
INSERT dbo.SalesByQuarter(Y,Q,Sales)
    SELECT 2003, 2, 479000
    UNION SELECT 2003, 3, 321000
    UNION SELECT 2003, 4, 324000
    UNION SELECT 2004, 1, 612000
    UNION SELECT 2004, 2, 524000
    UNION SELECT 2004, 3, 342000
    UNION SELECT 2004, 4, 357000
    UNION SELECT 2005, 1, 734000
GO
 
SELECT Y, 
    [1] AS Q1,
    [2] AS Q2,
    [3] AS Q3,
    [4] AS Q4
FROM
    (SELECT Y, Q, Sales
        FROM SalesByQuarter) s
PIVOT
(
    SUM(Sales)
    FOR Q IN ([1],[2],[3],[4])
) p
ORDER BY [Y]
GO
 
DROP TABLE dbo.SalesByQuarter
GO

Editado por: (04/Septiembre/2008 - 19:37)

¿Responde a tu pregunta?
Cajina
3 mensajes
Rango: Novato
     
Agradecer
El 4 de Septiembre 2008

Tengo la ligera sospecha de que el usar el PIVOT requiere de columnas cuantitativas y no solo de columnas cualitativas.  

Por que si tengo estos datos:  

 

ID  

NOMBRE_CALIFICATIVO  

VALOR_CALIFICATIVO  

363  

BASELICOR  

TEQUILA  

363  

MATERIALENVASE  

ALUMINIO  

363  

PAQUETE  

N/A  

363  

SABOR  

TEQUILA  

363  

SUBMARCA  

ARTIC BAY  

363  

TIPOENVASE  

LATA  

363  

TIPOFERTA  

N/A  

363  

TIPOPAQUETE  

UNIDAD  

364  

BASELICOR  

VODKA  

364  

MATERIALENVASE  

ALUMINIO  

364  

PAQUETE  

N/A  

364  

SABOR  

CEREZA  

364  

SUBMARCA  

ARTIC BAY  

364  

TIPOENVASE  

LATA  

364  

TIPOFERTA  

N/A  

364  

TIPOPAQUETE  

UNIDAD  


 

Mi código es igual que el que me has dado:  

 

SELECT  

ID,  

[SUBMARCA] as SUBMARCA,  

[BASELICOR] as BASELICOR,  

[SABOR] as SABOR,  

[TIPOENVASE] as TIPOENVASE,  

[MATERIALENVASE] as MATERIALENVASE,  

[TIPOPAQUETE] as TIPOPAQUETE,  

[PAQUETE] as PAQUETE,  

[TIPOFERTA] as TIPOFERTA  

FROM  

(  

SELECT ID, NOMBRE_CALIFICATIVO, VALOR_CALIFICATIVO  

FROM dbo.vw_CalificativosVertical  

) p  

PIVOT  

(  

VALOR_CALIFICATIVO FOR NOMBRE_CALIFICATIVO IN  

([SUBMARCA],  

[BASELICOR],  

[SABOR],  

[TIPOENVASE],  

[MATERIALENVASE],  

[TIPOPAQUETE],  

[PAQUETE],  

[TIPOFERTA] )  

) AS n  

ORDER BY ID;  

   

Pero aun sigue dando el mismo error:  

   

Msg 156, Level 15, State 1, Line 17  

Incorrect syntax near the keyword "FOR".  

   

Lo que no entiendo es que todo esta bien escrito y no se por que no se ejecuta, todas las comas, las columnas, los paréntesis están donde deben estar y aun no doy con el problema.  

 

Es por esto que tuve que buscar otra forma de resolver el problema.  

Debería darme este resultado:  

   

ID  

BASELICOR  

MATERIALENVASE