如何查询单个SQL列并仅获取字符串的特定部分

时间:2019-01-14 18:01:57

标签: sql sql-server tsql

我试图查询并在列中显示所有唯一的BillingCode,以及获取每个BillingCode出现多少次的总计数。

问题在于,BillingCode未被分隔成自己的列,而是列中字符串的一部分,该字符串可能更长或更短,具体取决于帐户的设置。

保持不变并且可能会有所帮助的是,计费代码本身包含在标签12345中

我试图仅返回RawXml列中这些标签之间包含的内容

我已经在我自己的测试SQL服务器上进行了设置,以尝试解决这个问题,但是到目前为止,我对解决这个问题还没有走运。

这是一个SQL查询,用于创建一个新表,其中包含我正在使用的示例

CREATE TABLE mytable
    (Column1 varchar(100))
;

INSERT INTO mytable
    (Column1)
VALUES
('<Xml><Description /><BillingCode>Billing1</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>Billing12</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>TEST</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>BillingCodeHere</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>Billing3</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>123</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>Billing2</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>12345</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>Billing1</BillingCode></Xml>'),
('<Xml><Description>Line 1</Description><BillingCode>BillingCodeHere</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>Billing1</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>Billing2</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>Billing1</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>SomethingHere</BillingCode></Xml>'),
('<Xml><Description /><BillingCode>Billing2</BillingCode></Xml>')

我认为这是我最接近帐单代码的地方。我感觉自己很近,但是我一直被困在这里。

Select Right(RawXml, LEN(RawXml) - CHARINDEX('<BillingCode>', RawXml, 1) - 12)
From dbo.mytable

结果集看起来像这样

Billing1</BillingCode></Xml>
Billing12</BillingCode></Xml>
TEST</BillingCode></Xml>
BillingCodeHere</BillingCode></Xml>

我希望输出的内容是帐单代码标签之间包含的内容 ???

从这里,我将能够获得每个唯一计费代码的总数。

BillingCode     Total
TEST            1
SomethingHere   1
BillingCodeHere 2
Billing1        4
Billing2        3
Billing3        1

etc...

1 个答案:

答案 0 :(得分:3)

使用XML方法:

SELECT BillingCode, COUNT(*)
FROM  mytable
CROSS APPLY (SELECT CAST(Column1 AS XML)) u(v)
CROSS APPLY u.v.nodes('//BillingCode') s(c)
CROSS APPLY (SELECT s.c.value('.', 'nvarchar(128)')) AS z(BillingCode)
GROUP BY BillingCode;

db<>fiddle demo