计算行数,同时根据列跳过一些行

时间:2009-12-09 04:40:09

标签: sql sql-server sql-server-2008

我在SQL Server 2008中有一个看起来像这样的表:

ID   I1  I2 ...  IN
-------------------------
1    2   3  ..... 2
2    0   0  ..... 0 
3    2   1  ..... 5

其中IN约为9列。我需要做的是计算行数,但跳过I1..IN值为0的行。我是SQL的新手,我基本上都是这样的:

SELECT COUNT(ID) AS Expr1, 
       COUNT(I1) AS Expr2, 
       COUNT(I2) AS Expr3, 
       COUNT(IN) AS ExprN 
 FROM [mytable] 
WHERE (Expr2 !=0) 
  AND (Expr3 != 0) 
  AND (ExprN != 0)

我想有一种更简单,更有效的方法吗?我需要确保所有列条目都是0(除了ID)。我宁愿不依赖于单个列为0或不做出决定。我使用的是某人已创建的数据库,这些0应该是NULLS。

谢谢!

5 个答案:

答案 0 :(得分:1)

您可以在[mytable]上创建一个视图,用零替换零,并将该视图用于将来的所有选择。它可以帮助您逐渐将零到零假设转换为代码。

CREATE VIEW [myview]
AS
SELECT [ID],
    NULLIF(I1, 0) I1,
    NULLIF(I2, 0) I2,
    NULLIF([IN], 0) [IN]
FROM [mytable]

问题是,您是否要计算每列中非零值的数量,或者全部为零的行数?

SELECT COUNT(COALESCE(ID,I1,I2,[IN])) AS Expr1, 
       COUNT(I1) AS Expr2, 
       COUNT(I2) AS Expr3, 
       COUNT([IN]) AS ExprN 
 FROM [myview] 

Expr1将计算所有值为0或null的行数,Expr2将计算I1中的零和空值等。请注意,在这种情况下,每个结果列都可以不同的价值观。

答案 1 :(得分:0)

只需select count(*) from [mytable] where (i1<>0 and ... iN<>0)

答案 2 :(得分:0)

也许是这样的

SELECT COUNT(ID) AS CountOfRowsGreaterThanZero
FROM [mytable]
WHERE (I1>0) AND .... AND (IN>0)

当您计算行数时,您不需要计算每列,因为数字应该相同。

答案 3 :(得分:0)

如你所说,如果使用NULL解决了你的问题(因为COUNT(X)只计算非NULL值),那么用NULLIF

包装你的0

答案 4 :(得分:0)

SELECT COUNT(ID) AS Expr1, 
       COUNT(I1) AS Expr2, 
       COUNT(I2) AS Expr3, 
       COUNT(IN) AS ExprN 
 FROM [mytable] 
WHERE (I1 + I2 + I3 + I4 + [... +] IN) <> 0

...但我仍然不确定这会遇到你想要解决的问题。 COUNT(I1)将返回与COUNT(I2)相同的值,因为它们在所有行中都将为非NULL。您是否尝试查找具有非零值的行数?

SELECT COUNT(ID) AS Expr1,
       SUM(CASE WHEN I1 = 0 THEN 0 ELSE 1 END) as Expr2,
       SUM(CASE WHEN I2 = 0 THEN 0 ELSE 1 END) as Expr3,
       SUM(CASE WHEN IN = 0 THEN 0 ELSE 1 END) as ExprN,
 FROM [mytable] 
WHERE (I1 + I2 + I3 + I4 + [... +] IN) <> 0
相关问题