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
.