2017-08-15 60 views
1

下面的原始代码不会填充dx.ThirdDiagnosisCode。我需要从dx.AllDiagnosisCodes中获取第三个dx代码。SQL SSM 2012分开逗号然后转向列

SELECT 
txn.TransactionID 
,dx.DiagnosisPrimaryCodeset 
,dx.AllDiagnosisCodes 
,dx.PrimaryDiagnosisCode 
,dx.SecondDiagnosisCode 
,dx.ThirdDiagnosisCode 
,dx.FourthDiagnosisCode 
,dx.FifthDiagnosisCode 
,dx.SixthDiagnosisCode 
,dx.SeventhDiagnosisCode 
,dx.EighthDiagnosisCode 
,dx.NinthDiagnosisCode 
,dx.TenthDiagnosisCode 
,dx.EleventhDiagnosisCode 
,dx.TwelfthDiagnosisCode 
INTO #TMP_1 
FROM txn 
INNER JOIN dx ON txn.SourceID = dx.SourceID 

的dx.AllDiagnosisCodes列包含以下信息:

AllDiagnosisCodes 
    162.5,511.9, 
    427.89,414.00,272.4,162.9, 

有没有办法通过逗号,分裂代码然后piviot的infomration以下列在原来的代码?什么我正在寻找

,dx.PrimaryDiagnosisCode 
,dx.SecondDiagnosisCode 
,dx.ThirdDiagnosisCode 
,dx.FourthDiagnosisCode 
,dx.FifthDiagnosisCode 
,dx.SixthDiagnosisCode 
,dx.SeventhDiagnosisCode 
,dx.EighthDiagnosisCode 
,dx.NinthDiagnosisCode 
,dx.TenthDiagnosisCode 
,dx.EleventhDiagnosisCode 
,dx.TwelfthDiagnosisCode 

例子:

1dx     2dx     3dx    4dx 
    162.5    511.9 
    427.89    414.00    72.4   162.9 

我目前在这里与此代码到目前为止卡住。

SELECT A.[DiagnosisPrimaryCodeset], 
    Split.a.value('.', 'VARCHAR(100)') AS String 
FROM (
     SELECT [DiagnosisPrimaryCodeset], 
     CAST ('<M>' + REPLACE([AllDiagnosisCodes], ',', '</M><M>') + '</M>' AS XML) AS String 
     FROM dx 
     ) AS A 
    CROSS APPLY String.nodes ('/M') AS Split(a); 
+0

这是SQL Server 2012的问题?你应该适当地标记。 –

+0

通过在Google中输入“SQL拆分逗号分隔字符串到列”,您将获得很多提示。 https://www.google.ca/search?q=sql+split+comma+separated+string+into+columns&oq=SQL+Split+com&aqs=chrome.4.69i57j69i60j0l4.7256j0j7&sourceid=chrome&ie=UTF-8 – BobNoobGuy

回答

0

不需要垂直。我停在9dx,但你明白了。易于扩展

另外,我增加了NULLIF(),因为我看到尾随逗号

假设YourTable(或查询)如下:

enter image description here

Select A.ID 
     ,B.* 
from YourTable A 
Cross Apply (
       Select [1dx] = nullif(xDim.value('/x[1]','varchar(max)'),'') 
         ,[2dx] = nullif(xDim.value('/x[2]','varchar(max)'),'') 
         ,[3dx] = nullif(xDim.value('/x[3]','varchar(max)'),'') 
         ,[4dx] = nullif(xDim.value('/x[4]','varchar(max)'),'') 
         ,[5dx] = nullif(xDim.value('/x[5]','varchar(max)'),'') 
         ,[6dx] = nullif(xDim.value('/x[6]','varchar(max)'),'') 
         ,[7dx] = nullif(xDim.value('/x[7]','varchar(max)'),'') 
         ,[8dx] = nullif(xDim.value('/x[8]','varchar(max)'),'') 
         ,[9dx] = nullif(xDim.value('/x[9]','varchar(max)'),'') 
       From (Select Cast('<x>' + replace(A.AllDiagnosisCodes,',','</x><x>')+'</x>' as xml) as xDim) as A 
      ) B 

返回

enter image description here

0

http://jahaines.blogspot.ca/2009/06/converting-delimited-string-of-values.html

我已经看到了,询问如何将一个分隔的值成列的几个问题,所以我想我会谈论它在这里。在大多数情况下,建议使用字符串解析器函数来分割字符串;不过,今天我想谈谈另一种方法。此方法利用了SQL Server 2005中引入的XML数据类型。XML数据类型的好处在于它保留了文档顺序。文档顺序至关重要,因为它保证字符串在转换为XML时保持相同的顺序。我们首先创建一个包含几行数据的示例表。

DECLARE @t TABLE(ProductId INT, ProductName VARCHAR(25), SupplierId INT, Descr VARCHAR(50)) INSERT INTO @t VALUES (1,'Product1',1,'A1,10in,30in,2lbs'); INSERT INTO @t VALUES (2,'Product2',2,'T6,15in,30in,'); INSERT INTO @t VALUES (3,'Product3',1,'A2,1in,,0.5lbs'); 

好的,现在我们有我们的样本数据,让我们来谈谈我们的数据。 “Descr”列包含产品的4个属性。我们存储的属性是类型,长度,高度和重量。任何这些属性都可以在字符串中为空,但必须在字符串中表示。例如,“A1,10in,30in”在最后有一个逗号,因为重量是未知的,像“A1,10in,1lbs”这样的字符串有一个空的高度空间。如果我们没有这个空间,我们怎么能确定哪些属性与特定列相关联?答案是没有真正的方法知道这种方法或任何其他方法。

现在我们已经奠定了所有的基础工作,现在是开始构建我们的查询的时候了。我们将开始创建一个CTE(公用表表达式),确保将我们分隔的字符串转换为有效的XML。以下是我们的CTE的第一部分(这不是完整的代码)。

;WITH cte (ProductId, ProductName,SupplierId,Prod_Attributes) 
AS 
(
SELECT 
    [ProductId], 
    [ProductName], 
    [SupplierId], 
    CONVERT(XML,'<Product><Attribute>' 
     + REPLACE([Descr],',', '</Attribute><Attribute>') 
     + '</Attribute></Product>') AS Prod_Attributes 
FROM @t 
) 

您可能会问自己,这段代码做了什么?此CTE代码从表格@t中选择所有数据,但它也将分隔字符串转换为有效的XML。它是如何做到的?那么让我们分解代码来弄清楚。

这是感兴趣的转换代码:

CONVERT(XML,'<Product><Attribute>' 
    + REPLACE([Descr],',', '</Attribute><Attribute>') 
    + '</Attribute></Product>') AS Prod_Attributes 

这段代码需要输入字符串,并使用替代函数插入XML标记,使之具有有效的XML的外观和感觉。例如,字符串“A1,10in,30英寸,5磅”将被改造成

<Product> 
    <Attribute>A1</Attribute> 
    <Attribute>10in</Attribute> 
    <Attribute>30in</Attribute> 
    <Attribute>5lbs</Attribute> 
</Product> 

注:应该指出的是,我们用的是逗号划界。如果您的定界不同,则需要更改替换函数中的分隔符。分隔符位于列和结束XML标记之间。在下面的代码中,REPLACE([Descr],',','。分隔符用红色表示。

现在产品描述值是有效的XML格式,我们可以通过使用硬编码单值,如下所示

;WITH cte (ProductId, ProductName,SupplierId,Prod_Attributes) 
AS 
(
SELECT 
    [ProductId], 
    [ProductName], 
    [SupplierId], 
    CONVERT(XML,'<Product><Attribute>' 
     + REPLACE([Descr],',', '</Attribute><Attribute>') 
     + '</Attribute></Product>') AS Prod_Attributes 
FROM @t 
) 
SELECT 
    [ProductID], 
    [SupplierId], 
    Prod_Attributes.value('/Product[1]/Attribute[1]','varchar(25)') AS [Type], 
    Prod_Attributes.value('/Product[1]/Attribute[2]','varchar(25)') AS [Length], 
    Prod_Attributes.value('/Product[1]/Attribute[3]','varchar(25)') AS [Height], 
    Prod_Attributes.value('/Product[1]/Attribute[4]','varchar(25)') AS [Weight] 
FROM cte 

每个属性元素的单例是由硬编码值1-4表示如果有更多的列则需要指定更多的单身下面是结果:。

enter image description here

所以你有它。一个易于实施的解决方案,用于“分隔”或将分隔的值转换为列。