multiples funcion filas ejemplo convertir con columnas agregado sql pivot

funcion - SQL Server 2005, convierta las columnas en filas



pivot sql server ejemplo (6)

Consulta sin un PIVOT aunque otras respuestas prueban que puedes usar un PIVOT :)

SELECT MAX(DE.Text) AS DE, MAX(EN.Text) AS EN FROM TextTable AS TT LEFT JOIN TextTable AS DE ON DE.ID = TT.ID AND DE.ISO = ''DE'' LEFT JOIN TextTable AS EN ON EN.ID = TT.ID AND EN.ISO = ''EN''

Intento girar una mesa 90 grados: hacer filas de columnas. No se permite PIVOT ya que PIVOT requiere funciones agregadas.

Ejemplo: tengo una tabla con las columnas:
Yo dint,
ISO char (2),
Varchar de texto (255).

Entonces tengo esto:

ID ISO Text -- --- ---- 1 DE Auto 2 EN Car

Me gustaría obtener lo siguiente:

ID EN DE -- --- ---- 1 Car Auto

¿Cómo se logra eso?


Dado que usted solicitó explícitamente una solución no dinámica: esto debería funcionar, si sabe qué ISO tendrá en las filas. Llamé a la mesa "Prueba".

declare @temp table ([ID] int, [de] varchar(255), [en] varchar(255)) -- add ISOs if necessary INSERT @temp SELECT distinct [ID], '''', '''' from Test -- ADD '''' for other ISOs if necessary DECLARE c CURSOR read_only FOR SELECT [ID], [ISO], [Text] from test DECLARE @ID int, @ISO char(2), @Text varchar(255) OPEN c FETCH NEXT FROM c INTO @ID, @ISO, @Text WHILE (@@fetch_status <> -1) BEGIN IF (@@fetch_status <> -2) BEGIN UPDATE @temp SET [DE] = case when @ISO = ''DE'' then @Text else [de] end, [EN] = case when @ISO = ''EN'' then @Text else [en] end -- add ISOs if necessary WHERE [ID] = @ID END FETCH NEXT FROM c INTO @ID, @ISO, @Text END CLOSE c DEALLOCATE c SELECT * FROM @temp


Si prueba esta solución y obtiene un error de sintaxis intente establecer el modo de compatibilidad de su base de datos a través de

ALTER DATABASE myDatabase SET COMPATIBILITY_LEVEL = 90;

Esto establecerá la compatibilidad con SQLServer 2005 y las consultas anteriores ejecutarán un error de sintaxis w / oa.


select t.num_claim_no, rtrim (xmlagg (xmlelement (e, t.txt_remarks ||''@''|| t.dat_update_date || '' , '')).extract (''//text()''), '','') Remarks, rtrim (xmlagg (xmlelement (e, t.num_update_no || '' , '')).extract (''//text()''), '','') SrlNo from gc_clm_gen_info t where t.txt_remarks is not null group by t.num_claim_no ;


Encontré la solución de la siguiente manera:

SELECT ID, DE, EN FROM TextTable PIVOT(MAX([text]) FOR ISO IN (DE,EN)) p

Es posible usar PIVOT con la función de agregación MAX sobre el texto.


Esta respuesta es realmente de frantisek , solo estoy copiando aquí para corregir el error (no puedo editar directamente).

Básicamente, usas esa solución, con un ajuste:

SELECT max(DE) as DE, max(EN) as EN FROM test PIVOT (MAX([text]) FOR ISO in (DE,EN)) p

Esto obtendrá el contenido en una sola fila. Además, descarta la ID, ya que no tiene sentido si quiere una sola fila (no hay ninguna lógica que indique qué hacer con ella cuando se combina en una sola fila).

Además, se asume que los valores en la columna ISO son únicos, de lo contrario, esto perderá datos debido al agregado MAX .