jueves, 19 de octubre de 2017

Referencias cruzadas

Un ejemplo de como crear una referencia cruzada en sql server

drop table #datos

create table #datos (fila int, columna int, valor numeric(10,2))

insert into #datos (fila, columna, valor)values(1,1,10)

insert into #datos (fila, columna, valor)values(1,2,10)

insert into #datos (fila, columna, valor)values(2,3,10)

insert into #datos (fila, columna, valor)values(3,4,10)

DECLARE @columns varchar(MAX);
DECLARE @sql nvarchar(max)

SET @columns = STUFF( ( SELECT   ',' + QUOTENAME(columna) FROM (SELECT distinct columna FROM #datos ) AS T ORDER BY columna FOR XML PATH('') ), 1, 1, '');
print @columns

 SET @sql = N'
 SELECT
   *
  FROM
  (
  SELECT  fila, valor, columna
  FROM #datos
  ) AS T
  PIVOT 
  (
  sum(valor)
  FOR columna IN (' + @columns + N')
  ) AS P order by fila;';

EXEC sp_executesql @sql;


Si el resultado de la referencia cruzada quisieras utilizarlo combinado con otra tabla deberías inviarlo a una tabla temporal

drop table ##respuesta

 SET @sql = N'
 SELECT
   * into ##respuesta
  FROM
  (
  SELECT  fila, valor, columna
  FROM #datos
  ) AS T
  PIVOT 
  (
  sum(valor)
  FOR columna IN (' + @columns + N')
  ) AS P order by fila;
 ';

EXEC sp_executesql @sql;

select * from ##respuesta;


No hay comentarios: