Ver Mensaje Individual
  #12 (permalink)  
Antiguo 28/05/2013, 20:20
leon8_correa9
 
Fecha de Ingreso: mayo-2013
Mensajes: 7
Antigüedad: 11 años, 5 meses
Puntos: 0
Sonrisa Respuesta: De filas a columnas

aqui esta la solucion algo coomplicada pero al fin se pudo, ahora si a dormir un rato
Código SQL:
Ver original
  1. GO
  2. /******  se crea un  sp_ para cualquier tabla y cualquier dato Objeto:  StoredProcedure [dbo].[GeneratePivotQuery]    Fecha de la secuencia de comandos: 05/28/2013 20:41:25 ******/
  3. SET ANSI_NULLS ON
  4. GO
  5. SET QUOTED_IDENTIFIER ON
  6. GO
  7. ALTER proc [dbo].[GeneratePivotQuery] (
  8. @TableName VARCHAR(100), -- Table to select from
  9. @AggregateFunction VARCHAR(10), -- Aggregate to be done on the value column
  10. @ValueColumn VARCHAR(100),
  11. @PivotColumn VARCHAR(100), -- Column for which the values needs to be transposed
  12. @FilterCondition nvarchar(4000), -- Filtering to be done on choosing the pivot values
  13. @OtherColumns VARCHAR(1000)) -- Columns selected other than the pivot columns
  14. AS
  15. BEGIN
  16.  
  17. DECLARE @List VARCHAR(MAX)
  18. DECLARE @ConcatQuery nvarchar(MAX)
  19.  
  20. SET @ConcatQuery = 'select @ListOut = stuff((select distinct '',' +
  21. CHAR(10) + CHAR(9) + '['' + '+ @PivotColumn +
  22. ' + '']'' from ' + @TableName +
  23. isnull(' where ' + @FilterCondition,'') +
  24. ' for xml path('''')),1,1,'''')'
  25.  
  26. EXEC sp_executesql
  27. @ConcatQuery,
  28. N'@ListOut varchar(MAX) output',
  29. @ListOut = @List OUTPUT
  30.  
  31. /* this will print the query used to generate the pivoted result */
  32. print 'select '+ CHAR(10) + CHAR(9) + @OtherColumns + ','
  33. + @List + CHAR(10) + ' from ' + @TableName + CHAR(13) +
  34. ' pivot (' + CHAR(10) + replicate(CHAR(9),2) +
  35. @AggregateFunction + '(' + @ValueColumn +
  36. ') for ' + @PivotColumn + ' in (' +
  37. REPLACE(REPLACE(@List,CHAR(9),''),CHAR(10),'') + ')' +
  38. CHAR(13)+ CHAR(9) + CHAR(9) + ') as P' + replicate(CHAR(10),5)
  39.  
  40. /* this will generate the result set */
  41. EXEC('select '+ @OtherColumns + ',' + @List + ' from ' + @TableName +
  42. ' pivot (' + @AggregateFunction + '(' + @ValueColumn +
  43. ') for ' + @PivotColumn + ' in (' + @List + ')) as P')
  44.  
  45. END
y de esta manera se ejecuta


Código SQL:
Ver original
  1. DECLARE @TableName VARCHAR(100)
  2. DECLARE @AggregateFunction VARCHAR(10)
  3. DECLARE @ValueColumn VARCHAR(100)
  4. DECLARE @PivotColumn VARCHAR(100)
  5. DECLARE @FilterCondition nvarchar (4000)
  6. DECLARE @OtherColumns VARCHAR(1000)
  7.  
  8. SET @TableName = 'acumulado'
  9. SET @AggregateFunction = 'sum'
  10. SET @ValueColumn = 'subtotal'
  11. SET @PivotColumn = 'FECHA'
  12. SET @FilterCondition = 'FECHA between ''20130401'' and ''20130430'''
  13. SET @OtherColumns = 'sucursal'
  14.  
  15. EXECUTE [dbo].[GeneratePivotQuery]
  16. @TableName
  17. ,@AggregateFunction
  18. ,@ValueColumn
  19. ,@PivotColumn
  20. ,@FilterCondition
  21. ,@OtherColumns

Última edición por gnzsoloyo; 28/05/2013 a las 21:22 Razón: SQL mal etiquetado