我的查询需要一些帮助...我想在每个房子里计算一些名字,所有col#都是名字。
查询:
SELECT House#,
COUNT(CASE WHEN col#1 IS NOT NULL THEN 1 ELSE 0 END) +
COUNT(CASE WHEN col#2 IS NOT NULL THEN 1 ELSE 0 END) +
COUNT(CASE WHEN col#3 IS NOT NULL THEN 1 ELSE 0 END) as count
FROM myDB
WHERE House# in (house#1,house#2,house#3)
GROUP BY House#
期望的结果:
房子1 - 计数是3 / 房子2 - 计数是2 / 房子3 - 计数是1
...使用我当前的查询,计数结果只是3的
答案 0 :(得分:6)
在这种情况下,似乎计算名称与计算逗号(,
)加上一个相同:
SELECT House_Name,
LEN(Names) - LEN(REPLACE(Names,',','')) + 1 as Names
FROM dbo.YourTable;
答案 1 :(得分:2)
自Lamak偷走我的雷声后的另一个选择是将其拆分并规范化您的数据,然后进行汇总。这使用common split function,但您可以使用任何内容,包括STRING_SPLIT用于SQL Server 2016+或您自己的...
declare @table table (house varchar(16), names varchar(256))
insert into @table
values
('house 1','peter, paul, mary'),
('house 2','sarah, sally'),
('house 3','joe')
select
t.house
,NumberOfNames = count(s.Item)
from
@table t
cross apply dbo.DelimitedSplit8K(names,',') s
group by
t.house
答案 2 :(得分:1)
请注意你得到的答案对于他们正在做的事情是如何复杂的?那是因为关系数据库不是为那种方式存储数据而设计的。
另一方面,如果您将数据结构更改为以下内容:
house name
1 peter
1 paul
1 mary
2 sarah
2 sally
3 joe
现在的查询是:
select house, count(name)
from housenames
group by house
所以我建议这样做:使用更适合SQL Server的设计,您的查询变得更简单,更高效。
答案 3 :(得分:0)
一个肮脏的技巧是用空字符串替换逗号并比较长度:
SELECT house +
' has ' +
CAST((LEN(names) - LEN(REPLACE(names, ',', '')) + 1) AS VARCHAR) +
' names'
FROM mytable
答案 4 :(得分:0)
您可以使用xml进行解析并查找计数如下:
Select *, a.xm.value('count(/x)','int') from (
Select *, xm = CAST('<x>' + REPLACE((SELECT REPLACE(names,', ','$$$SSText$$$') AS [*] FOR XML PATH('')),'$$$SSText$$$','</x><x>')+ '</x>' AS XML) from #housedata
) a
答案 5 :(得分:0)
select House, 'has '+cast((LEN(Names)-LEN(REPLACE(Names, ',', ''))+1) as varchar)+' names'
from TempTable