我如何计算这些列中有多少在SQL中具有值?

时间:2010-10-15 20:30:05

标签: sql sql-server tsql

假设下表:

ID | Item1 | Item2 | Item3 | Item4 | Item5
------------------------------------------
A  | NULL  | NULL  | YES   | YES   | NULL
B  | NULL  | NULL  | NULL  | YES   | NULL
C  | NULL  | NULL  | NULL  | NULL  | NULL

我想返回以下数据集:

ID  | Count
------------
A   | 2
B   | 1
C   | 0

基本上,我想要计算Item1-5中有多少列不是NULL的ID

如何在MS-SQL中执行此操作?

5 个答案:

答案 0 :(得分:4)

未经测试,但这样的事情应该有效。

SELECT
  Id,
  SUM(
    CASE WHEN Item1 is NULL THEN 0 ELSE 1 END
    +
    CASE WHEN Item2 is NULL THEN 0 ELSE 1 END
    +
    CASE WHEN Item3 is NULL THEN 0 ELSE 1 END
    +
    CASE WHEN Item4 is NULL THEN 0 ELSE 1 END
    +
    CASE WHEN Item5 is NULL THEN 0 ELSE 1 END
    ) 'Count'
FROM 
   tableName
GROUP BY 
   Id

答案 1 :(得分:2)

尝试:

DECLARE @YourTable table (ID char(1), Item1 varchar(3), Item2 varchar(3), Item3 varchar(3), Item4 varchar(3), Item5 varchar(3))
INSERT @YourTable VALUES ('A'  , NULL  , NULL  , 'YES' , 'YES' , NULL)
INSERT @YourTable VALUES ('B'  , NULL  , NULL  , NULL  , 'YES' , NULL)
INSERT @YourTable VALUES ('C'  , NULL  , NULL  , NULL  , NULL  , NULL)

SELECT
    ID, CASE WHEN ITEM1 IS NULL THEN 0 ELSE 1 END
       +CASE WHEN ITEM2 IS NULL THEN 0 ELSE 1 END
       +CASE WHEN ITEM3 IS NULL THEN 0 ELSE 1 END
       +CASE WHEN ITEM4 IS NULL THEN 0 ELSE 1 END
       +CASE WHEN ITEM5 IS NULL THEN 0 ELSE 1 END AS [Count]
    FROM @YourTable

输出:

ID   Count
---- -----------
A    2
B    1
C    0

(3 row(s) affected)

答案 2 :(得分:0)

这应该这样做:

SELECT ID, (case when item1 is null then 0 else 1 end)+
           (case when item2 is null then 0 else 1 end)+
           (case when item3 is null then 0 else 1 end)+
           (case when item4 is null then 0 else 1 end)+
           (case when item5 is null then 0 else 1 end) AS Count 
FROM Table
ORDER BY ID

我希望这是一个假设的问题而不是实际的生产表。

答案 3 :(得分:0)

另一种选择:如果您使用的是sql 2k5或更高版本,则还可以使用unpivot来计算所有非空值。但是,您不会直接从此查询中获取零计数的任何行。然而,它确实保存了案例陈述的乏味。

select
    ID, count(ItemCount) as ItemCount
from
(
    select ID, Item1, Item2, Item3, Item4, Item5
    from TableA a
) t
unpivot
(
    ItemCount for Item in
    (
        Item1, Item2, Item3, Item4, Item5
    )
) as unpvt
group by
    ID

答案 4 :(得分:0)

另一种技巧。

SELECT
    ID, 
    (SELECT COUNT(C) FROM( 
            SELECT Item1 C 
            UNION ALL 
            SELECT Item2 
            UNION ALL 
            SELECT Item3 
            UNION ALL 
            SELECT Item4 
            UNION ALL 
            SELECT Item5)
             D)
AS [Count]
FROM @YourTable