Sql сервер отделяет строку и сводит результат - PullRequest
0 голосов
/ 29 января 2020

У меня есть строка, полученная из запроса и разделенная разделителем:

enter image description here

После этого мне нужно поставить столбцы вместо строки, это то, что я делаю из поиска примеров.

Declare @NomeAux varchar(255)
Declare @id int = 3059
select @NomeAux =  des_auxiliar from WKF_ProcessoItem  where Id_ProcessoItem = @id 

 SELECT   @id as id,Split.a.value('.', 'NVARCHAR(MAX)') valores
 into #temp
FROM
(   
    SELECT CAST('<X>'+REPLACE(@NomeAux, ';', '</X><X>')+'</X>' AS XML) AS String
) AS A
CROSS APPLY String.nodes('/X') AS Split(a);

SELECT 
    Id
,   [GSE]
,   [LOCAL]
,   [SN]
,   [Modelo]
,   [Fechadura]
,   [Vazio]
FROM #temp
PIVOT (
    max(valores)
    FOR valores IN ([GSE], [LOCAL], [SN],[Modelo],[Fechadura],[Vazio])
) AS PIVOTED

Но я получаю все значения null, как это:

Я получаю все значения null

enter image description here

Нужный мне результат

enter image description here

1 Ответ

0 голосов
/ 30 января 2020

Это выглядит как довольно странный способ хранения списка EAV (Entity-Attribute-Value), где id обозначает объект, а текст - пара имя-значение . Попробуйте что-нибудь по этому поводу:

DECLARE @tbl TABLE(id INT,valores VARCHAR(100));
INSERT INTO @tbl VALUES
 (1,'[GSE] SAO')
,(1,'NOME DO LOCAL: CASH')
,(1,'SN:1111')
,(1,'MODELO: blah1')
,(1,'FECHADURA: 11')
,(2,'[GSE] SAO')
,(2,'NOME DO LOCAL: CREDIT')
,(2,'SN:2222')
,(2,'MODELO: blah2')
,(2,'FECHADURA: 22');

SELECT t.id
      ,MAX(CASE WHEN valoresXml.value('/x[1]/text()[1]','nvarchar(max)')='[GSE] SAO' THEN t.valores END) AS GSE
      ,MAX(CASE WHEN valoresXml.value('/x[1]/text()[1]','nvarchar(max)')='NOME DO LOCAL' THEN valoresXml.value('/x[2]/text()[1]','nvarchar(max)') END) AS NomeDoLocal
      ,MAX(CASE WHEN valoresXml.value('/x[1]/text()[1]','nvarchar(max)')='SN' THEN valoresXml.value('/x[2]/text()[1]','nvarchar(max)') END) AS SN
      ,MAX(CASE WHEN valoresXml.value('/x[1]/text()[1]','nvarchar(max)')='MODELO' THEN valoresXml.value('/x[2]/text()[1]','nvarchar(max)') END) AS Modelo
      ,MAX(CASE WHEN valoresXml.value('/x[1]/text()[1]','nvarchar(max)')='FECHADURA' THEN valoresXml.value('/x[2]/text()[1]','nvarchar(max)') END) AS Fechadura

FROM @tbl t
CROSS APPLY(SELECT CAST('<x>' + REPLACE(t.valores,':','</x><x>') + '</x>' AS XML)) A(valoresXML)
GROUP BY t.id;

Результат

id  GSE     NomeDoLocal SN      Modelo  Fechadura
1   [GSE] SAO    CASH   1111     blah1   11
2   [GSE] SAO    CREDIT 2222     blah2   22

Идея вкратце:

Этот метод называется "условной агрегацией" (вид старомодный pivot).
Мы используем XML для разделения текста на : -характер (как насчет [GSE] SAO?).
Мы возвращаем сгруппированный набор со значениями, взятыми условно .

...