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

如何计算这些列中有多少列在SQL中具有值?,sql,sql-server,tsql,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 --------

假设下表:

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中有多少列不是该ID的
NULL

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

这应该可以做到:

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

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

未经测试,但类似的问题应该可以解决

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
尝试:

输出:

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

(3 row(s) affected)

还有一个选项:如果您使用的是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
另一种技术

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

这实际上是一个非常奇怪的一次性销售查询,它想知道某个产品是否具有未设置为Null的某些属性。感谢Joe添加ends:)。此代码会出错,因为每个案例都需要“END”。此外,“when NULL”将不起作用,每行将返回5个计数。@Joe Stefanelli,您修复了“ends”,但此查询仍然返回错误的结果。使用我的答案中的示例代码,插入此查询并自己尝试。如果item1为空,那么这个CASE是格式不正确的,
CASE…
就像我的回答中那样。我可能错了,但我打赌ID是主键,这意味着不需要
SUM()
groupby
并且只会增加查询的开销。我认为是一样的,但不想假设。
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