Этот вопрос касается одной и той же темы, но имеет два сценария.
У меня есть набор значений, которые я извлекаю из OData.В нем есть столбец с переменными, который я хочу объединить и объединить
create table xmpltbl
( [Location] nvarchar(max),
[Site] nvarchar(max),
[Variable] nvarchar(max),
[Period] datetimeoffset(3),
[StringValue] nvarchar(max),
[NumericValue] decimal(10,2)
);
INSERT INTO xmpltbl
(
[Location],
[Site],
[Variable],
[Period],
[StringValue],
[NumericValue]
)
VALUES
('UK','London','Customer1','2019-01-01 00:28:53.897','Company A',NULL),
('UK','London','Product1','2019-01-01 00:28:53.897', 'Sand' ,NULL),
('UK','London','Division1','2019-01-01 00:28:53.897','Supplies',NULL),
('UK','London','Expense1','2019-01-01 00:28:53.897',NULL,150),
('UK','London','Customer2','2019-01-01 00:28:53.897','CompanyB',NULL),
('UK','London','Product2','2019-01-01 00:28:53.897','Bricks',NULL),
('UK','London','Division2','2019-01-01 00:28:53.897','Building Materials',NULL),
('UK','London','Expense2','2019-01-01 00:28:53.897',NULL,300),
('France','Paris','Customer3','2020-01-01 00:28:53.897','Company C',NULL),
('France','Paris','Product3','2020-01-01 00:28:53.897','Cement',NULL),
('France','Paris','Division3','2019-01-01 00:28:53.897','Supplies',NULL),
('France','Paris','Expense3','2019-01-01 00:28:53.897',NULL,75);
Мне нужны переменные с одинаковыми номерами, чтобы они находились в одной строке со значением рядом с ними.В идеале я хотел бы сделать это с SSIS, так как я собираю данные, используя это.
Я хочу, чтобы это выглядело так
Location Site Period Customer Product Division Total
UK London 2019 CompanyA Sand Supplies 150
UK London 2019 CompanyB Bricks Building Materials 300
France Paris 2020 CompanyC Cement Supplies 75
Есть также некоторые данные, которые не соответствуют
Customer1 + Product1, Division1, Expense1
и должны быть
Customer1 + Product10, Division10, Expense10
Customer1 + Product11, Division11, Expense11
Я подумал об использовании динамического центра, так как есть около 60 из этих переменных, которые я начал работать.Однако это соединение, но я не могу сделать.Я попытался сделать CROSS APPLY, но он не вернет мне значение, даже если я положу его во временную таблицу.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT ',' + QUOTENAME(Variable)
FROM xmpltbl
GROUP BY Variable
ORDER BY Variable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Location, Site, NumericValue, Period, ' + @cols + ' from
(
select Location
, Site
, Variable
, NumericValue
, Period
, StringValue
from xmpltbl
) x
pivot
(
max(StringValue)
for Variable in (' + @cols + ')
) p '
execute (@query);