SQL Server 2008 dinámico pivote basado en valor ordinal

Tengo una UDF que divide una cadena de caracteres delimitada por un espacio. A medida que la función recorre cada cadena, si encuentra un espacio y hace una división, se inserta un número ordinal en la tabla de resultados en su propia columna junto con la cadena dividida. He pivotado sobre este número ordinal pero, por supuesto, estos números cambian según la cadena de caracteres. Necesito consultar estos números ordinales y usarlos en mi pivote. ¿Alguien podría mostrarme cómo se puede hacer esto con SQL dinámico? He visto ejemplos en diferentes foros, pero creo que esto podría ser más simple de lo que he visto. Mi procedimiento está a continuación. Si alguien necesita el UDF, lo publicaré también.

--The original data is pulled from column "DataString" in "MyData" table.
--After declaring the UDF split function the function is used and the results are
--inserted into a table called "ScriptResult" with this query
SELECT * 
INTO ScriptResult
FROM    
    MyData x    
    CROSS APPLY    
    dbo.Split (x.DataString, ' ') S

Where rtrim(s.StringValue) != '' 

--Then the table is pivoted on column Ordinal from table ScriptResult to summarize the data

Select *
INTO ScriptPivot
From ScriptResult
pivot (max (StringValue) for Ordinal in ([1], [2], [3], [5], [7], [8], [9], [10], [11]))
as   PivotResult 

Entrada de ejemplo:

R 456 ACCOUNT 56779900 23499000800973983989883 56 99750927     890-0983
Y 123M 120 M/Y JOHN DOE E 5678873940000056 000000 0003456      678-7898
U 06           000000 000567 000000000000000000M688399000      789-8388
H 120                                                          785-7848
R 456          0000000000000000000006578 786936689663   DTY578   568-7890

Estoy tomando un archivo plano antiguo y lo estoy des-ingeniando en sql. El problema es que el proceso por lotes que crea estos archivos solo tiene filas de 120 caracteres sin normalización, etc. Estoy tratando de ingresarlos en Sql Server. Confío en que podría hacer esto más fácilmente con un asistente de importación, pero necesito un Stor.Proceedure porque estos pisos todavía se están usando y esto tendrá que hacerse a diario. Resultado deseado: la tabla dinámica que tengo es el resultado que necesito, pero solo necesito poder usar esto para todas las cadenas de datos que obtengo así y ninguna de ellas es uniforme, por lo que los números ordinales difieren. Pero así es como debería verse ...

1---2---3-------5--------7----------8-------------9--10-----------11   
R   456 ACCOUNT 56779900 2349900080 0973983989883 56 99750927     890-0983

Aquí hay un ejemplo de tabla dinámica dinámica de Adventure Works DB ... DECLARE @PivotColumnHeaders VARCHAR (MAX) SELECT @PivotColumnHeaders = COALESCE (@PivotColumnHeaders + ', [' + cast (Name as varchar) + ']', '[' + cast (Nombre como varchar) + ']') FROM Sales.SalesTerritory

DECLARE @PivotTableSQL NVARCHAR(MAX)
SET @PivotTableSQL = N'
  SELECT *
  FROM (
    SELECT
      YEAR(H.OrderDate) [Year],
      T.Name,
      H.TotalDue
    FROM Sales.SalesOrderHeader H
    LEFT JOIN Sales.SalesTerritory T
      ON H.TerritoryID = T.TerritoryID
  ) AS PivotData
  PIVOT (
    SUM(TotalDue)
    FOR Name IN (
      ' + @PivotColumnHeaders + '
    )
  ) AS PivotTable
'

EXECUTE(@PivotTableSQL)

¿Podría de alguna manera adaptar esto para mi uso?

preguntado el 16 de mayo de 11 a las 20:05

¡Guau! ¿He topado con Stack? o ¿No di suficiente información? -

Proporcione una entrada de ejemplo y los resultados deseados. -

Los 1,2,3,5,7,8,9,10, 11, XNUMX, XNUMX, XNUMX, XNUMX, XNUMX, XNUMX y XNUMX son los nombres de las columnas (obviamente sin los hyphiens) -

Si el problema que tiene es porque las cadenas de entrada son diferentes, ¿puede su ejemplo incluir un ejemplo de cadenas diferentes? Aún no estoy seguro de lo que está tratando de hacer. Por qué necesita SQL dinámico, etc.

Los números de las columnas cambian. En algunas divisiones son 2.5.814.57, etc., así que no puedo usar estos números estáticos. Sí, absolutamente puedo dar algunos ejemplos más de cadenas diferentes. En eso... -

1 Respuestas

Si tuvieras una mesa llamada Ordinals (o lo que desee) que contenga números suficientes para cubrir el número máximo de ordinales que podría obtener, esto puede funcionar para usted: -

declare @ordList varchar(max);
select @ordList = stuff((select ', [' + rtrim(ordinal) + ']' as [text()] 
from ( 
    select distinct convert(varchar,ordinal) ordinal from Ordinals 
) ords for xml path('')),1,1,'')

exec ('select * from ( select ' + @ordList + ' from dataTable) tbl pivot (max(stringValue) FOR [1] in (' + @ordList + ')) PVT' ) end

Esto es más o menos lo mismo que la muestra de AW

Respondido 22 ago 11, 12:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.