degauss, resolvamos este problema, de la forma no mas ortodoxa, sin entrar en discusion que tenemos un poblema de diseño con su tabla de entrada.
Esto es solo un "tip" y debe tomarse como tal, al final de haber probado este codigo, usted decida que hacer:
Código SQL:
Ver original-- Creo mi tabla de paso
CREATE TABLE #test (id INT, Name VARCHAR(30), Valor CHAR(2))
-- Inserto mis registros de paso
INSERT INTO #test VALUES(1 ,'Field_A','XX')
INSERT INTO #test VALUES(1 ,'Field_B','ZZ')
INSERT INTO #test VALUES(1 ,'Field_C','XX')
INSERT INTO #test VALUES(2 ,'Field_A','DD')
INSERT INTO #test VALUES(2 ,'Field_C','FF')
INSERT INTO #test VALUES(3 ,'Field_B','WW')
-- Creo una tabla de resultado
CREATE TABLE #Resultado (id INT, Field_A CHAR(2), Field_B CHAR(2), Field_C CHAR(2))
-- Inserto los ID distintos de mi tabla de paso
INSERT INTO #Resultado (id)
SELECT DISTINCT ID FROM #test
-- Actualizo la primera columna FIELD_A de mi tabla resultado
UPDATE #Resultado SET Field_A = LaUnion.FIELD_A
FROM(
SELECT
t1.id, t1.Valor AS FIELD_A,
'' AS FIELD_B,
'' AS FIELD_C
FROM
#test t1
WHERE
t1.Name = 'FIELD_A'
UNION
SELECT
t1.id, '' AS FIELD_A,
t1.Valor AS FIELD_B,
'' AS FIELD_C
FROM
#test t1
WHERE
t1.Name = 'FIELD_B'
UNION
SELECT
t1.id, '' AS FIELD_A,
'' AS FIELD_B,
t1.valor AS FIELD_C
FROM
#test t1
WHERE
t1.Name = 'FIELD_C'
) AS LaUnion JOIN Resultado ON LaUnion.ID = Resultado.id
WHERE LEN(LaUnion.FIELD_A) > 0
-- Verifico la solucion
SELECT * FROM #Resultado
PD: No utilizo las soluciones aqui expuestas por FLAVIOVICH e ERWINRP, ya que no hay una sumatoria que nos puediera ayudar con el GROUP BY.
Si alguien tiene alguna propuesta mejor, quisiera verla