Urgente!!! Consulta SQL pasar datos de una tabla vertical a horizontal.

19/10/2004 - 14:06 por riospower | Informe spam
Hola grupo. Tengo una tabla como esta:

Empresa codcita fechacita

AGUSTIN BENITEZ SÁNCHEZ 0 28/07/2004
AGUSTIN MORALES MORAN 2 23/07/2004
AGUSTIN VELLOSO GONZALEZ 0 27/07/2004
AGUSTIN VELLOSO GONZALEZ 5 26/07/2004
AGUSTIN VELLOSO GONZALEZ 0 12/07/2004
AGUSTIN VELLOSO GONZALEZ 2 12/07/2004
AGUSTIN VELLOSO GONZALEZ 0 08/07/2004
AGUSTIN VELLOSO GONZALEZ 4 06/07/2004
AGUSTIN VELLOSO GONZALEZ 0 05/07/2004
AGUSTIN VELLOSO GONZALEZ 5 05/07/2004


Y me gustaría realizar un select q la transformara en la siguiente
tabla:

Empresa cita1 cita2 cita3 cita4 cita5
AGUSTIN BENITEZ SÁNCHEZ 0 null null null null
AGUSTIN MORALES MORAN 2 null null null null
AGUSTIN VELLOSO GONZALEZ 0 5 0 2 0

Como podeis observar solo me hacen falta las últimas cinco citas de
cada empresa o cliente, estas están ordenadas descendentemente (cita1
más reciente). ME da igual que aparezca null o -1 si no hay citas.

Si alguién tiene alguna solución agradecería que la posteara pq me
estoy volviendo locoooo...

Preguntas similare

Leer las respuestas

#1 Isaias
19/10/2004 - 17:19 | Informe spam
Hola

Aqui mismo hemos publicado varios ejemplos como este:

For example, given data as shown below:

ID year type amt
7 1999 1 23
8 1999 2 44
9 1999 3 55
10 2000 1 66
11 2000 2 77
12 2000 3 88
13 1999 1 11

... you can pivot the data to show the years down the side and the types
across the top...
year 1 2 3 RowTotal
1999 34 44 55 133
2000 66 77 88 231

... and get the SQL which would produce this table

SELECT Pivot_Data.*,
(Pivot_Data.[1] + Pivot_Data.[2] + Pivot_Data.[3]) AS RowTotal
FROM (SELECT [year],
SUM(CASE [type] WHEN '1' THEN [amt] ELSE 0 END) AS [1],
SUM(CASE [type] WHEN '2' THEN [amt] ELSE 0 END) AS [2],
SUM(CASE [type] WHEN '3' THEN [amt] ELSE 0 END) AS [3]
FROM (select * from zzjunk) AS Base_Data
GROUP BY [year]) AS Pivot_Data
Respuesta Responder a este mensaje
#2 riospower
20/10/2004 - 08:54 | Informe spam
Gracias por el ejemplo Isaias, pero fíjate que lo que propongo no es
exactamente eso. Fíjate que no quiero una columna con cada tipo de
cita...

Empresa codcita fechacita

AGUSTIN BENITEZ SÁNCHEZ 0 28/07/2004
AGUSTIN MORALES MORAN 2 23/07/2004
AGUSTIN VELLOSO GONZALEZ 0 27/07/2004
AGUSTIN VELLOSO GONZALEZ 5 26/07/2004
AGUSTIN VELLOSO GONZALEZ 0 12/07/2004
AGUSTIN VELLOSO GONZALEZ 2 12/07/2004
AGUSTIN VELLOSO GONZALEZ 0 08/07/2004
AGUSTIN VELLOSO GONZALEZ 4 06/07/2004
AGUSTIN VELLOSO GONZALEZ 0 05/07/2004
AGUSTIN VELLOSO GONZALEZ 5 05/07/2004


Y me gustaría realizar un select q la transformara en la siguiente
tabla:

Empresa cita1 cita2 cita3 cita4 cita5
AGUSTIN BENITEZ SÁNCHEZ 0 null null null null
AGUSTIN MORALES MORAN 2 null null null null
AGUSTIN VELLOSO GONZALEZ 0 5 0 2 0

Como podeis observar solo me hacen falta las últimas cinco citas de
cada empresa o cliente, estas están ordenadas descendentemente (cita1
más reciente). ME da igual que aparezca null o -1 si no hay citas.


Isaias wrote in message news:...
Hola

Aqui mismo hemos publicado varios ejemplos como este:

For example, given data as shown below:

ID year type amt
7 1999 1 23
8 1999 2 44
9 1999 3 55
10 2000 1 66
11 2000 2 77
12 2000 3 88
13 1999 1 11

... you can pivot the data to show the years down the side and the types
across the top...
year 1 2 3 RowTotal
1999 34 44 55 133
2000 66 77 88 231

... and get the SQL which would produce this table

SELECT Pivot_Data.*,
(Pivot_Data.[1] + Pivot_Data.[2] + Pivot_Data.[3]) AS RowTotal
FROM (SELECT [year],
SUM(CASE [type] WHEN '1' THEN [amt] ELSE 0 END) AS [1],
SUM(CASE [type] WHEN '2' THEN [amt] ELSE 0 END) AS [2],
SUM(CASE [type] WHEN '3' THEN [amt] ELSE 0 END) AS [3]
FROM (select * from zzjunk) AS Base_Data
GROUP BY [year]) AS Pivot_Data
Respuesta Responder a este mensaje
#3 riospower
22/10/2004 - 10:52 | Informe spam
Alguien q me eche una manita.

(Rios) wrote in message news:...
Hola grupo. Tengo una tabla como esta:

Empresa codcita fechacita

AGUSTIN BENITEZ SÁNCHEZ 0 28/07/2004
AGUSTIN MORALES MORAN 2 23/07/2004
AGUSTIN VELLOSO GONZALEZ 0 27/07/2004
AGUSTIN VELLOSO GONZALEZ 5 26/07/2004
AGUSTIN VELLOSO GONZALEZ 0 12/07/2004
AGUSTIN VELLOSO GONZALEZ 2 12/07/2004
AGUSTIN VELLOSO GONZALEZ 0 08/07/2004
AGUSTIN VELLOSO GONZALEZ 4 06/07/2004
AGUSTIN VELLOSO GONZALEZ 0 05/07/2004
AGUSTIN VELLOSO GONZALEZ 5 05/07/2004


Y me gustaría realizar un select q la transformara en la siguiente
tabla:

Empresa cita1 cita2 cita3 cita4 cita5
AGUSTIN BENITEZ SÁNCHEZ 0 null null null null
AGUSTIN MORALES MORAN 2 null null null null
AGUSTIN VELLOSO GONZALEZ 0 5 0 2 0

Como podeis observar solo me hacen falta las últimas cinco citas de
cada empresa o cliente, estas están ordenadas descendentemente (cita1
más reciente). ME da igual que aparezca null o -1 si no hay citas.

Si alguién tiene alguna solución agradecería que la posteara pq me
estoy volviendo locoooo...
Respuesta Responder a este mensaje
#4 Manuel Andréu
22/10/2004 - 13:56 | Informe spam
Prueva con este procedimiento que copie de algun sitio.


CREATE PROCEDURE sp_PivotTable
@cTable varchar(80), -- Nombre de Tabla
@cDown varchar(80), -- Encabezado/s de fila
@cAcross varchar(80), -- Encabezado de columna
@cFunc varchar(80), -- Funcion de Agregado
@cAggFld varchar(80), -- Campo sobre el que se aplica la función de agregado
@cWhere varchar(200) -- Criterio
As


DECLARE @cColTtl varchar(80),
@cSQLStr varchar(200),
@cSQL varchar(8000),
@nRows Int,
@nCntr Int

ENCABEZADOS DE COLUMNA
SET @cSQL = '' +
' SELECT DISTINCT ' + @cAcross +
' AS Pivot_Value INTO TempUniq ' +
' FROM '+ @cTable +
' WHERE ' + @cWHere+ ' ORDER BY 1 '
EXEC(@cSQL)


SELECT
IDENTITY(int, 1,1) as Pivot_Row,
@cFunc as Pivot_Func,
@cAggFld as Pivot_AggFld,
@cAcross as Pivot_Fld,
@cColTtl as Pivot_Col,
Pivot_Value,
@cSQLStr as Pivot_SQL
INTO TempPivot
FROM TempUniq
ORDER BY Pivot_Value

'Col_'+Replace(RTrim(LTrim(Convert(varchar(80),Pivot_Value))),' ','_')
UPDATE TempPivot
SET Pivot_Col = '['+RTrim(LTrim(Convert(varchar(80),Pivot_Value))) + ']'


UPDATE TempPivot
SET Pivot_SQL=LTrim(RTrim(Pivot_Col))+'='+Pivot_Func+'(case when
'+Pivot_Fld+'=Pivot_Value and Pivot_Col='''+Pivot_Col+''' Then
'+Pivot_AggFld+' else Null end)'

SELECT @nRows=Max(Pivot_Row),@nCntr=Min(Pivot_Row)
FROM TempPivot
SET @cSQL=''
WHILE @nCntr <= @nRows
Begin
SELECT @cSQL=@cSQL+','+Pivot_SQL
FROM TempPivot
WHERE Pivot_Row=@nCntr

SET @nCntr=@nCntr+1
End

Set @cSQL= '' +
' SELECT '+@cDown+','+Substring(@cSQL,2,8000)+
' FROM '+@cTable+' Join TempPivot on('+@cAcross+'=Pivot_Value) ' +
' WHERE '+@cWhere+
' GROUP BY '+@cDown+
' ORDER BY '+@cDown
Exec(@cSQL)


Drop Table TempUniq
Drop Table TempPivot




A,B,C,D,...-- r>
Function},{Pivot -- Field},{Filer}
try','Year(OrderDate)','Sum','Freight',' -- 1=1'
try','Year(OrderDate)','Sum','Freight',' -- Year(OrderDate)>1996'
ID,ShipCountry','Year(OrderDate)','Sum', -- 'Freight','1=1'
ID,ShipCountry','Year(OrderDate)','Sum', -- 'Freight','1=1'
ID,ShipCountry','Substring(ShipCountry,1 -- ,1)','Sum','Freight','1=1'



"Rios" escribió en el mensaje
news:
Alguien q me eche una manita.

(Rios) wrote in message
news:...
Hola grupo. Tengo una tabla como esta:

Empresa codcita fechacita

AGUSTIN BENITEZ SÁNCHEZ 0 28/07/2004
AGUSTIN MORALES MORAN 2 23/07/2004
AGUSTIN VELLOSO GONZALEZ 0 27/07/2004
AGUSTIN VELLOSO GONZALEZ 5 26/07/2004
AGUSTIN VELLOSO GONZALEZ 0 12/07/2004
AGUSTIN VELLOSO GONZALEZ 2 12/07/2004
AGUSTIN VELLOSO GONZALEZ 0 08/07/2004
AGUSTIN VELLOSO GONZALEZ 4 06/07/2004
AGUSTIN VELLOSO GONZALEZ 0 05/07/2004
AGUSTIN VELLOSO GONZALEZ 5 05/07/2004


Y me gustaría realizar un select q la transformara en la siguiente
tabla:

Empresa cita1 cita2 cita3 cita4 cita5
AGUSTIN BENITEZ SÁNCHEZ 0 null null null null
AGUSTIN MORALES MORAN 2 null null null null
AGUSTIN VELLOSO GONZALEZ 0 5 0 2 0

Como podeis observar solo me hacen falta las últimas cinco citas de
cada empresa o cliente, estas están ordenadas descendentemente (cita1
más reciente). ME da igual que aparezca null o -1 si no hay citas.

Si alguién tiene alguna solución agradecería que la posteara pq me
estoy volviendo locoooo...
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida