如何计算列

时间:2012-03-24 12:09:37

标签: sql sql-server count

表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
....

如何进行查询,需要查询帮助

3 个答案:

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

DEMO

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