我在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。
谢谢!
答案 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