TSQL计数' 1'在一个字符串位置,按位置

时间:2016-08-11 08:02:35

标签: sql tsql select count aggregate

有类似字段的字段:

" 101011111000000101010011000101 ..."如果设置为" 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

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

2 个答案:

答案 0 :(得分:4)

SELECT SUM(CASE WHEN SUBSTRING([Interests], _ID.ID, 1) = '1' THEN 1 ELSE 0 END) AS xcount, _ID.ID
FROM [db1].[dbo].[Contacts], (VALUES (1),(2),(3),(4),(5)) AS _ID(ID)
GROUP BY _ID.ID
ORDER BY xcount DESC

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

答案 1 :(得分:1)

这将计算由0和1

组成的字符串中的'1'数
declare @s varchar(100) ='101011111000000101010011000101';
select cnt = len(@s) - len(replace(@s,'0',''))