#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