динамический свод sql server 2008 на основе порядкового значения

#sql-server-2008 #pivot #dynamic-sql

#sql-server-2008 #сводный #динамический-sql

Вопрос:

У меня есть UDF, который разбивает символьную строку, разделенную пробелом. Поскольку функция перебирает каждую строку, если она находит пробел и производит разделение, порядковый номер вставляется в таблицу результатов в свой собственный столбец вместе с разделенной строкой. Я сделал поворот на этом порядковом номере, но, конечно, эти номера меняются в зависимости от символьной строки. Мне нужно запросить эти порядковые номера и использовать их в моем своде. Может ли кто-нибудь показать мне, как это можно сделать с помощью динамического sql? Я видел примеры на разных форумах, но я думаю, что это могло бы быть проще, чем то, что я видел. Моя процедура приведена ниже. Если кому-то понадобится UDF, я также опубликую его.

 --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 
  

Пример ввода:

 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
  

Я беру старый плоский файл и перенастраиваю его в sql. Проблема в том, что пакетный процесс, который создает эти файлы, содержит всего 120 символьных строк без нормализации и т.д. Я пытаюсь перенести их в Sql Server. Я понимаю, что мог бы сделать это проще с помощью мастера импорта, но мне нужен Stor.Продолжайте, потому что эти плоские данные все еще используются, и это нужно будет делать ежедневно.
Желаемый результат: Сводная таблица, которая у меня есть, — это нужный мне результат, но мне просто нужно иметь возможность использовать это для всех строк данных, которые я получаю подобным образом, и ни одна из них не является однородной, поэтому порядковые номера отличаются.
Но вот как это должно выглядеть…

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

Вот пример динамической сводной таблицы из базы данных adventure works…
ОБЪЯВИТЬ ПЕРЕМЕННУЮ @PivotColumnHeaders (МАКСИМУМ)
ВЫБЕРИТЕ @PivotColumnHeaders =
ОБЪЕДИНИТЬ(
@PivotColumnHeaders ‘,[‘ приведение (имя как varchar) ‘]’,
‘[‘ приведение (имя как varchar) ‘]’
)
Из отдела продаж.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)
  

Могу ли я как-то адаптировать это для своего использования?

Комментарии:

1. Вау! Я поставил в тупик стек? или я не предоставил достаточно информации?

2. Пожалуйста, предоставьте пример ввода и желаемые результаты.

3. 1,2,3,5,7,8,9,10 и 11 — это имена столбцов (очевидно, без дефисов)

4. Если проблема, с которой вы столкнулись, заключается в том, что входные строки отличаются, может ли ваш пример включать пример отличающихся строк? Все еще не уверен, что вы пытаетесь сделать. Зачем вам нужен динамический SQL и т.д.

5. Номера столбцов меняются. В некоторых разделениях они равны 2.5.814.57 и т.д. поэтому я не могу просто использовать эти статические числа. Да, я могу, безусловно, привести еще несколько примеров отличающихся строк. На нем…

Ответ №1:

Если у вас должна была быть таблица с именем Ordinals (или как вы хотите), которая содержит числа, достаточные для покрытия максимального количества ординалов, которое вы могли бы получить, это может сработать для вас:-

 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
  

Это практически то же самое, что и в примере AW