使用case语句计算非空列的数量

时间:2017-08-16 19:46:21

标签: sql sql-server

我的查询需要一些帮助...我想在每个房子里计算一些名字,所有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的

6 个答案:

答案 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