我正在尝试查询并在列中显示所有唯一的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...

最佳答案

使用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

10-05 18:19