Как добавить столбец Unit в @Header для каждой строки с флагом Allow 1? - PullRequest
1 голос
/ 20 июня 2020

Я работаю над запросом для SQL Server 2012. У меня проблема: я не могу добавить единицу столбца в @Header.

Когда строка во временной таблице #nonparametric имеет флаг Allow установлен в 1, он должен иметь два столбца на единицу.

Здесь у меня есть флаг, позволяющий установить значение 1 для каждой семьи и параметр c, поэтому он должен содержать @Header.

есть ParametricUnit, familyUnit, потому что у меня есть Flag Allow = 1 для параметров c и family в таблице temp

в # nonparametri c temp table.

с другим значением в таблице #nonparametri c Я получу все DKFeatureName с флагом Allow 0 будет иметь один

столбец, но DkFeatureName с Flag Allow = 1 будет иметь дополнительный столбец для каждого модуля, его имена будут столбцом + 'Unit' для переменной @Header.

create table #nonparametricdata
(
PART_ID nvarchar(50) ,
CompanyName  nvarchar(50),
PartNumber nvarchar(50),
DKFeatureName nvarchar(100),
Tempvalue nvarchar(50),
FlagAllow bit
)

insert into #nonparametricdata
values
('1222','Honda','silicon','package','15.50Am',0),
('1900','MERCEIS','GLASS','family','90.00Am',1),--have column per Unit on @Header because FlagAllow=1
('5000','TOYOTA','alominia','source','70.20kg',0),
('8000','MACDA','motor','parametric','50.40kg',1),--have column per Unit on @Header because FlagAllow=1
('8900','JEB','mirror','noparametric','75.35kg',0)

create table #FinalTable
(
DKFeatureName  nvarchar(50),
DisplayOrder  int
)

insert into #FinalTable (DKFeatureName,DisplayOrder) 
values 
('package',3),
('family',4),
('source',5),
('parametric',2),
('noparametric',1)

то, что я пробую, показано ниже:

DECLARE @Header NVARCHAR(MAX)
SELECT
    @Header = STUFF(
        (
            SELECT ', ' + QUOTENAME (DKFeatureName)
            FROM #FinalTable
            ORDER BY DisplayOrder
            FOR XML PATH ('')
        ),1,2,''
    )
    select @Header

Ожидаемый результат:

[noparametric], [parametric],[parametricUnit], [package], [family],[familyUnit], [source]

1 Ответ

1 голос
/ 20 июня 2020

Немного хака, но с использованием JOIN и простого CASE

Пример

DECLARE @Header NVARCHAR(MAX)
SELECT
    @Header = STUFF(
        (
            SELECT ', ' + quotename(A.DKFeatureName) + case when B.FlagAllow = 1 then ','+quotename(A.DKFeatureName+'Unit') else '' end
            FROM #FinalTable A
            Join #nonparametricdata B on A.DKFeatureName=B.DKFeatureName
            ORDER BY DisplayOrder
            FOR XML PATH ('')
        ),1,2,''
    )
    select @Header

Возвращает

[noparametric], [parametric], [parametricUnit], [package], [family], [familyUnit], [source]

РЕДАКТИРОВАТЬ.

Вы можете изменить

Join #nonparametricdata B on A.DKFeatureName=B.DKFeatureName

на

Join (Select distinct DKFeatureName,FlagAllow 
       From #nonparametricdata 
     ) B on A.DKFeatureName=B.DKFeatureName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...