如何计算这些列中有多少列在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