varianza promedio funciones funcion ejemplos definicion datos agregado agregacion sql sql-server tsql pivot pivot-without-aggregate

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;