根据字符划分字符串并在 SQL 服务器中计数
Divide string based on character and count in SQL Server
我有一个table如下图
数据1
Delta,Charlie
Delta,Bravo
Bravo,Charlie
Tango,Bravo
Alpha
我想统计字数
所以我想得到类似
的东西
Delta 2
Charlie 2
Bravo 3
Tango 1
Alpha 1
我的想法是创建一个临时 table 并根据字符拆分字符串,并根据此处定义的函数将其插入临时 table 中:T-SQL split string 和然后将它们分组并计数。有没有更好的方法?
无需临时 table,您可以一次性完成 运行。
看这个例子:
DECLARE
@tb TABLE (data1 VARCHAR(500) )
INSERT INTO @tb VALUES
('Delta,Charlie'),
('Delta,Bravo'),
('Bravo,Charlie'),
('Tango,Bravo'),
('Alpha')
SELECT data1, COUNT(*) total
FROM (
SELECT LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) data1
FROM (
SELECT CAST('<XMLRoot><RowData>' + REPLACE(data1,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) split
FROM @tb
) D
CROSS APPLY split.nodes('/XMLRoot/RowData')m(n)
) D
GROUP BY data1
更多说明(根据请求的 scsimon)
上述方法是使用XML分割字符串的方法之一。基本上我们所做的是用定义每个拆分的 XML 标签 </RowData><RowData>
替换实际数据中的逗号,然后将其与定义每一行的另一个 XML 标签 <XMLRoot><RowData></RowData></XMLRoot>
连接。
因此,如果我们得到第一行,例如 Delta,Charlie
,它将被转换为:
<XMLRoot>
<RowData>Delta</RowData>
<RowData>Charlie</RowData>
</XMLRoot>
如果您知道 XML 结构的工作原理或至少 HTML(两者都有相似之处),那么您就会明白。
然后,我们使用 SQL 服务器已经支持的 XML 技术,并选择节点(行),然后将其转换回 VARCHAR
以作为单个值处理(常规行)。
这是一个快速的解释,虽然还有很多其他方法,其中一些也使用 XML,这取决于您的喜好。
如果您需要其他技术,可以 check this out ,它涵盖了几乎所有其他技术。 (也是一篇好文章)。
如果您使用的是 SQL Server 2016 或更高版本,您可以使用 STRING_SPLIT 函数,这会得到相同的结果。
我有一个table如下图
数据1
Delta,Charlie
Delta,Bravo
Bravo,Charlie
Tango,Bravo
Alpha
我想统计字数
所以我想得到类似
的东西Delta 2
Charlie 2
Bravo 3
Tango 1
Alpha 1
我的想法是创建一个临时 table 并根据字符拆分字符串,并根据此处定义的函数将其插入临时 table 中:T-SQL split string 和然后将它们分组并计数。有没有更好的方法?
无需临时 table,您可以一次性完成 运行。
看这个例子:
DECLARE
@tb TABLE (data1 VARCHAR(500) )
INSERT INTO @tb VALUES
('Delta,Charlie'),
('Delta,Bravo'),
('Bravo,Charlie'),
('Tango,Bravo'),
('Alpha')
SELECT data1, COUNT(*) total
FROM (
SELECT LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) data1
FROM (
SELECT CAST('<XMLRoot><RowData>' + REPLACE(data1,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) split
FROM @tb
) D
CROSS APPLY split.nodes('/XMLRoot/RowData')m(n)
) D
GROUP BY data1
更多说明(根据请求的 scsimon)
上述方法是使用XML分割字符串的方法之一。基本上我们所做的是用定义每个拆分的 XML 标签 </RowData><RowData>
替换实际数据中的逗号,然后将其与定义每一行的另一个 XML 标签 <XMLRoot><RowData></RowData></XMLRoot>
连接。
因此,如果我们得到第一行,例如 Delta,Charlie
,它将被转换为:
<XMLRoot>
<RowData>Delta</RowData>
<RowData>Charlie</RowData>
</XMLRoot>
如果您知道 XML 结构的工作原理或至少 HTML(两者都有相似之处),那么您就会明白。
然后,我们使用 SQL 服务器已经支持的 XML 技术,并选择节点(行),然后将其转换回 VARCHAR
以作为单个值处理(常规行)。
这是一个快速的解释,虽然还有很多其他方法,其中一些也使用 XML,这取决于您的喜好。
如果您需要其他技术,可以 check this out ,它涵盖了几乎所有其他技术。 (也是一篇好文章)。
如果您使用的是 SQL Server 2016 或更高版本,您可以使用 STRING_SPLIT 函数,这会得到相同的结果。