TSQL按位置对字符串位置中的“1”进行计数

TSQL按位置对字符串位置中的“1”进行计数,sql,tsql,select,count,aggregate,Sql,Tsql,Select,Count,Aggregate,有这样的类别字段: SELECT COUNT(SUBSTRING([Interests], 1, 1)) AS xcount, 1 AS ID FROM [db1].[dbo].[Contacts] WHERE SUBSTRING([Interests], 1, 1) = '1' UNION SELECT COUNT(SUBSTRING([Interests], 2, 1)) AS xcount, 2 AS ID FROM [db1].[dbo].[Contacts] WHERE SUBSTRI

有这样的类别字段:

SELECT COUNT(SUBSTRING([Interests], 1, 1)) AS xcount, 1 AS ID
FROM [db1].[dbo].[Contacts]
WHERE SUBSTRING([Interests], 1, 1) = '1'
UNION
SELECT COUNT(SUBSTRING([Interests], 2, 1)) AS xcount, 2 AS ID
FROM [db1].[dbo].[Contacts]
WHERE SUBSTRING([Interests], 2, 1) = '1'
UNION
SELECT COUNT(SUBSTRING([Interests], 3, 1)) AS xcount, 3 AS ID
FROM [db1].[dbo].[Contacts]
WHERE SUBSTRING([Interests], 3, 1) = '1'
UNION
SELECT COUNT(SUBSTRING([Interests], 4, 1)) AS xcount, 4 AS ID
FROM [db1].[dbo].[Contacts]
WHERE SUBSTRING([Interests], 4, 1) = '1'
UNION
SELECT COUNT(SUBSTRING([Interests], 5, 1)) AS xcount, 5 AS ID
FROM [db1].[dbo].[Contacts]
WHERE SUBSTRING([Interests], 5, 1) = '1'
ORDER BY xcount DESC
101011110000000101010011000101。。。如果设置为1,则此字符串中的每个位置都表示特定类别。 所以1表示已设置,0表示未设置。 我想数一数数量最多为1的类别,并按降序排列

我目前的解决方案是:

SELECT COUNT(SUBSTRING([Interests], 1, 1)) AS xcount, 1 AS ID
FROM [db1].[dbo].[Contacts]
WHERE SUBSTRING([Interests], 1, 1) = '1'
UNION
SELECT COUNT(SUBSTRING([Interests], 2, 1)) AS xcount, 2 AS ID
FROM [db1].[dbo].[Contacts]
WHERE SUBSTRING([Interests], 2, 1) = '1'
UNION
SELECT COUNT(SUBSTRING([Interests], 3, 1)) AS xcount, 3 AS ID
FROM [db1].[dbo].[Contacts]
WHERE SUBSTRING([Interests], 3, 1) = '1'
UNION
SELECT COUNT(SUBSTRING([Interests], 4, 1)) AS xcount, 4 AS ID
FROM [db1].[dbo].[Contacts]
WHERE SUBSTRING([Interests], 4, 1) = '1'
UNION
SELECT COUNT(SUBSTRING([Interests], 5, 1)) AS xcount, 5 AS ID
FROM [db1].[dbo].[Contacts]
WHERE SUBSTRING([Interests], 5, 1) = '1'
ORDER BY xcount DESC

有更好或更快的方法来计算这些类别吗?

这将计算由0和1组成的字符串中“1”的数量

declare @s varchar(100) ='101011111000000101010011000101';
select cnt = len(@s) - len(replace(@s,'0',''))

这将计算由0和1组成的字符串中“1”的数目

declare @s varchar(100) ='101011111000000101010011000101';
select cnt = len(@s) - len(replace(@s,'0',''))
对于更多类别,只需增加_ID序列即可


对于更多类别,只需增加ID序列。

您有多少个类别?所有兴趣的长度相同?字段长度上的类别数。该表中的所有记录都是相同的。但是可能还有其他长度不同的字段……但是这种选择方法应该适用于所有长度。您需要动态查询来获取所有类别您有多少个类别?所有兴趣的长度相同?字段长度上的类别数。该表中的所有记录都是相同的。但是可能还有其他长度不同的字段……但是这种选择方法应该适用于所有长度。您需要动态查询来获取所有类别,但它不起作用。SQL Server说ID是一个不明确的列名。您的联系人表是否包含ID列?然后在我的解决方案ID中替换为任何其他名称。@Sergey Tally table可以帮助声明@n int=从[db1].[dbo].[Contacts]中选择TOP1 len[Interests]。。。选择TOP@nN as ID从理货订单中通过N as _ID…它不起作用。SQL Server说ID是一个不明确的列名。您的联系人表是否包含ID列?然后在我的解决方案ID中替换为任何其他名称。@Sergey Tally table可以帮助声明@n int=从[db1].[dbo].[Contacts]中选择TOP1 len[Interests]。。。选择TOP@nN作为理货单的ID由N作为_ID…不,这不是我想做的。如果位置包含“1”,我想在所有记录中计算字符串的位置1,并将其重新绘制为一个位置。不,这不是我想做的。如果该位置包含“1”,我想在所有记录中计算字符串的位置1,并为一个位置重新绘制该位置。