 |
|
Tema creado el 3 de Septiembre 2008
|
 |
 |
Cajina
|
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, ...
|
 |
 |
 |
 |
|
Envía a un amigo
|
|
Experto de Foros
Isaías
Experto en SQL Server.
1687 mensajes
Rango:
Posteador habitual
|
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:
 | (1) | |
|
|
|
Cajina
|
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, ...
|
|
|
Experto de Foros
Isaías
Experto en SQL Server.
1687 mensajes
Rango:
Posteador habitual
|
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)
|
|
|
Cajina
|
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
|
| | | | | |