Sql server分离字符串并透视结果
我有一个从查询中获取的字符串,用分隔符分隔: 之后,我需要将其放入列而不是行中,这就是我在搜索示例时所做的Sql server分离字符串并透视结果,sql,sql-server,tsql,split,pivot,Sql,Sql Server,Tsql,Split,Pivot,我有一个从查询中获取的字符串,用分隔符分隔: 之后,我需要将其放入列而不是行中,这就是我在搜索示例时所做的 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)') va
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
但我得到的所有值都是空的,如下所示:
我得到的所有值都为空
我需要的结果
这看起来是一种非常奇怪的存储EAV列表实体属性值的方法,其中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;
简而言之:
这种技术被称为条件聚合,是一种老式的枢轴。
我们使用XML在:-字符处分割文本,那么[GSE]SAO呢?。
我们返回一个分组集,其中包含有条件获取的值。我看不出需要根据结果拆分什么。只需按原样透视表,看看您得到了什么。这是哪个版本的SQL Server?
id GSE NomeDoLocal SN Modelo Fechadura
1 [GSE] SAO CASH 1111 blah1 11
2 [GSE] SAO CREDIT 2222 blah2 22