promedio - Pivote TSQL sin función agregada
sql varianza (9)
El OP en realidad no necesitaba pivotar sin una agregación, pero para aquellos de ustedes que vinieron aquí, para saber cómo ver:
consulta cte parametrizada sql
La respuesta a esa pregunta implica una situación en la que se necesita un pivote sin agregación, por lo que un ejemplo de hacerlo es parte de la solución.
Tengo una mesa como esta ...
CustomerID DBColumnName Data
--------------------------------------
1 FirstName Joe
1 MiddleName S
1 LastName Smith
1 Date 12/12/2009
2 FirstName Sam
2 MiddleName S
2 LastName Freddrick
2 Date 1/12/2009
3 FirstName Jaime
3 MiddleName S
3 LastName Carol
3 Date 12/1/2009
Y quiero esto ...
¿Es esto posible usando PIVOT?
CustomerID FirstName MiddleName LastName Date
----------------------------------------------------------------------
1 Joe S Smith 12/12/2009
2 Sam S Freddrick 1/12/2009
3 Jaime S Carol 12/1/2009
Esta es una excelente forma de crear campos dinámicos para una consulta dinámica:
--summarizar valores en una tabla tmp
declare @STR varchar(1000)
SELECT @STr = COALESCE(@STr +'', '', '''')
+ QUOTENAME(DateRange)
from (select distinct DateRange, ID from ##pivot)d order by ID
--- ver los campos generados
print @STr
exec('' .... pivot code ...
pivot (avg(SalesAmt) for DateRange IN ('' + @Str +'')) AS P
order by Decile'')
Esto debería funcionar:
select * from (select [CustomerID] ,[Demographic] ,[Data]
from [dbo].[pivot]
) as Ter
pivot (max(Data) for Demographic in (FirstName, MiddleName, LastName, [Date]))as bro
Ok, lo siento por la pobre pregunta. gbn me puso en el camino correcto. Esto es lo que estaba buscando en una respuesta.
SELECT [FirstName], [MiddleName], [LastName], [Date]
FROM #temp
PIVOT
( MIN([Data])
FOR [DBColumnName] IN ([FirstName], [MiddleName], [LastName], [Date])
)AS p
Luego tuve que usar una instrucción while y construir la declaración anterior como varchar y usar dynmaic sql.
Usando algo como esto
SET @fullsql = @fullsql + ''SELECT '' + REPLACE(REPLACE(@fulltext,''('',''''),'')'','''')
SET @fullsql = @fullsql + ''FROM #temp ''
SET @fullsql = @fullsql + ''PIVOT''
SET @fullsql = @fullsql + ''(''
SET @fullsql = @fullsql + '' MIN([Data])''
SET @fullsql = @fullsql + '' FOR [DBColumnName] IN ''+@fulltext
SET @fullsql = @fullsql + '')''
SET @fullsql = @fullsql + ''AS p''
EXEC (@fullsql)
Tener una para construir @fulltext usando un ciclo while y seleccionar los distintos nombres de columna fuera de la tabla. Gracias por las respuestas.
Prueba esto:
SELECT CUSTOMER_ID, MAX(FIRSTNAME) AS FIRSTNAME, MAX(LASTNAME) AS LASTNAME ...
FROM
(
SELECT CUSTOMER_ID,
CASE WHEN DBCOLUMNNAME=''FirstName'' then DATA ELSE NULL END AS FIRSTNAME,
CASE WHEN DBCOLUMNNAME=''LastName'' then DATA ELSE NULL END AS LASTNAME,
... and so on ...
GROUP BY CUSTOMER_ID
) TEMP
GROUP BY CUSTOMER_ID
Puede usar el agregado MAX, aún así funcionaría. MAX de un valor = ese valor ..
En este caso, también podría unirse a sí mismo 5 veces en customerid, filtrar por dbColumnName por referencia de tabla. Puede funcionar mejor.
si, pero por qué !!??
Select CustomerID,
Min(Case DBColumnName When ''FirstName'' Then Data End) FirstName,
Min(Case DBColumnName When ''MiddleName'' Then Data End) MiddleName,
Min(Case DBColumnName When ''LastName'' Then Data End) LastName,
Min(Case DBColumnName When ''Date'' Then Data End) Date
From table
Group By CustomerId
SELECT
main.CustomerID,
f.Data AS FirstName,
m.Data AS MiddleName,
l.Data AS LastName,
d.Data AS Date
FROM table main
INNER JOIN table f on f.CustomerID = main.CustomerID
INNER JOIN table m on m.CustomerID = main.CustomerID
INNER JOIN table l on l.CustomerID = main.CustomerID
INNER JOIN table d on d.CustomerID = main.CustomerID
WHERE f.DBColumnName = ''FirstName''
AND m.DBColumnName = ''MiddleName''
AND l.DBColumnName = ''LastName''
AND d.DBColumnName = ''Date''
Editar: he escrito esto sin un editor y no he ejecutado el SQL. Espero que captes la idea.
WITH pivot_data AS
(
SELECT customerid, -- Grouping Column
dbcolumnname, -- Spreading Column
data -- Aggregate Column
FROM pivot2
)
SELECT customerid, [firstname], [middlename], [lastname]
FROM pivot_data
PIVOT (max(data) FOR dbcolumnname IN ([firstname],[middlename],[lastname])) AS p;