表1 '示例数据:
ID value1 Value2 value3
001 10 20 30
002 20 10 null
003 10 null null
004 10 null 30
....
从表1中,我想进行一次计数。
行查询次数
Select count(*) from table1
'它只会给行数。
但我需要列数,哪个列值不应为空
预期输出
ID | totcolumn
-----------------
001 3
002 2
003 1
004 2
....
如何进行查询,需要查询帮助
答案 0 :(得分:6)
使用SUM
,如下所示:
SELECT id,
SUM(CASE WHEN value1 IS NULL then 0 ELSE 1 END) +
SUM(CASE WHEN value2 IS NULL then 0 ELSE 1 END) +
SUM(CASE WHEN value3 IS NULL then 0 ELSE 1 END) AS 'COUNT'
FROM table1
group by id
答案 1 :(得分:3)
如果您使用的是MS SQL Server 2005或更高版本,这是一个使用UNPIVOT的好机会。首先设置一些样本数据:
create table ColumnCount (
ID char(3) not null,
Value1 int,
Value2 int,
Value3 int
)
insert into ColumnCount(ID,Value1,Value2,Value3)
select '001',10,20,30
union all select '002',20,10,null
union all select '003',10,null,null
union all select '004',10,null,30
union all select '005',null,null,null
我在上面提供的示例数据中添加了005,以显示如何处理所有ValueX列为空的情况。
UNPIVOT为您规范化“数据”,以便您可以对行使用COUNT:
select *
from ColumnCount
unpivot (Value for ValueN in (Value1, Value2, Value3)) as upvt
ID Value ValueN
001 10 Value1
001 20 Value2
001 30 Value3
002 20 Value1
002 10 Value2
003 10 Value1
004 10 Value1
004 30 Value3
请注意,它已经消除了NULL值,因此您不必这样做。不幸的是,这意味着如果进行简单计数,所有ValueX列中包含NULL的行(例如,ID ='005')将不会显示。相反,将所有ID收集在子查询或CTE中,如下面的AllIds:
with ColumnsOnRows as (
select *
from ColumnCount
unpivot (Value for ValueN in (Value1, Value2, Value3)) as upvt
),
AllIds as (
select distinct ID
from ColumnCount
)
select AllIds.ID, count(distinct Value) as totcolumn
from AllIds
left outer join ColumnsOnRows
on ColumnsOnRows.ID = AllIds.ID
group by AllIds.ID
结果:
ID totcolumn
001 3
002 2
003 1
004 2
005 0
答案 2 :(得分:0)
如果我理解你的需要是这样的话
SELECT ISNULL(Value1,0)+ ISNULL(Value2,0)+ ISNULL(Value3,0)AS _Sum FROM table1
如果值为NULL,则ISNULL会将值替换为0