Как построить выборочное разделение временного значения запроса на два столбца: один на номер, а другой - в текст, когда флаг разрешен 1? - PullRequest
0 голосов
/ 20 июня 2020

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

Запрос разделяет временное значение столбца на два столбца Когда строка во временной таблице # nonparametri c имеет флаг Allow = 1,

он должен разделить значение Temp столбца из # nonparametri c на два столбца, когда флаг Allow = 1.

предположим, что значение Temp столбца имеет значение 50,40 кг он должен быть разделен на два столбца

Первый столбец с номером, поэтому он будет иметь 50,40 и будет иметь то же имя, что и Parametri c.

Второй столбец с текстом, поэтому он будет иметь кг и он будет иметь то же имя, что и Parametri c + 'Units'.

означает, что Name будет ParametricUnit.

Мне нужно создать запрос, который разделит это на два столбца, когда Flag Allow = 1.

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),--Build select query split data because FlagAllow=1
('5000','TOYOTA','alominia','source','70.20kg',0),
('8000','MACDA','motor','parametric','50.40kg',1),----Build select query split data 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 @SelectqueryData NVARCHAR(MAX)
   SELECT
   @SelectqueryData = STUFF(
    (
        SELECT ', ' +  case when B.FlagAllow = 1 then '['+A.DKFeatureName+'],['+A.DKFeatureName+'Unit]' else quotename(A.DKFeatureName) end
        FROM #FinalTable A
        join  (Select distinct DKFeatureName,FlagAllow 
   From #nonparametricdata 
 ) B on A.DKFeatureName=B.DKFeatureName

        ORDER BY DisplayOrder
        FOR XML PATH ('')
    ),1,2,''
)
select @SelectqueryData
--select @SelectqueryData from table

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

[noparametric], [parametric]--QueryGetNumber,[parametricUnit]--QueryGetUnitOfMeasure
, [package], [family]--QueryGetNumber,[familyUnit]--QueryGetUnitOfMeasure, [source]

Image must query done

при выполнении запроса выше он должен дать мне результат в виде изображения (только для объяснения):

1 Ответ

2 голосов
/ 20 июня 2020

Вы ищете DYNAMI C PIVOT

Пример

DECLARE @SelectqueryData NVARCHAR(MAX)
SELECT  @SelectqueryData = STUFF( (
           SELECT ', ' +  case when B.FlagAllow = 1 then '['+A.DKFeatureName+'],['+A.DKFeatureName+'Unit]' else quotename(A.DKFeatureName) end
           FROM #FinalTable A
           join  (Select distinct DKFeatureName,FlagAllow 
                   From #nonparametricdata 
                  ) B on A.DKFeatureName=B.DKFeatureName
           ORDER BY DisplayOrder
           FOR XML PATH ('')
         ),1,2,''
)

Declare @SQL varchar(max) = '
Select *
 From  (
        Select A.Part_ID 
              ,A.PartNumber
              ,A.CompanyName
              ,B.*
         From  #nonparametricdata A
         Cross Apply ( values ( DKFeatureName         ,case when FlagAllow=1 then left(TempValue,patindex(''%[A-Z]%'',TempValue+''A'')-1) else TempValue end ) 
                             ,( DKFeatureName+''Unit'',case when FlagAllow=1 then substring(TempValue,patindex(''%[A-Z]%'',TempValue+''A''),10) else null end ) 
                     ) B(Item,Value)
       ) src
 Pivot (max(value) for Item in ('+@SelectqueryData+') ) pvt
'
--Print @SQL
Exec(@SQL)            

Возвращает

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...