Sql 基于列跳过某些行时计算行数

Sql 基于列跳过某些行时计算行数,sql,sql-server,sql-server-2008,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 SELECT COUNT(ID) AS Expr1, COUNT(I1) AS Expr2, COUNT(I2) AS Expr3, COUNT(IN) AS ExprN

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

ID   I1  I2 ...  IN
-------------------------
1    2   3  ..... 2
2    0   0  ..... 0 
3    2   1  ..... 5
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)
其中IN约为9列。我需要做的是计算行数,但是跳过I1..IN的值为0的行。我是SQL新手,我基本上有以下几点:

ID   I1  I2 ...  IN
-------------------------
1    2   3  ..... 2
2    0   0  ..... 0 
3    2   1  ..... 5
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应该为空


谢谢

只需
从[mytable]中选择count(*),其中(i10和…iN0)
只需
从[mytable]中选择count(*),其中(i10和…iN0)
可能类似于此

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

在计算行数时,不需要计算每一列,因为数字应该是相同的。

可能是这样的

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

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

如果您提到使用NULL解决了问题(因为count(X)只计算非NULL值),那么如果您提到使用NULL解决了问题(因为count(X)只计算非NULL值),则用

将0包装起来,然后用

将0包装起来,选择COUNT(ID)作为Expr1,
将(I1)计数为Expr2,
将(I2)计数为Expr3,
算作出口
从[mytable]
其中(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
选择COUNT(ID)作为Expr1,
求和(当I1=0时,则为0,否则为1结束)为Expr2,
总和(当I2=0时,则为0,否则为1结束)为Expr3,
求和(IN=0时为0,否则为1结束)为ExprN,
从[mytable]
其中(I1+I2+I3+I4+[…+]IN)0
选择COUNT(ID)作为Expr1,
将(I1)计数为Expr2,
将(I2)计数为Expr3,
算作出口
从[mytable]
其中(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
选择COUNT(ID)作为Expr1,
求和(当I1=0时,则为0,否则为1结束)为Expr2,
总和(当I2=0时,则为0,否则为1结束)为Expr3,
求和(IN=0时为0,否则为1结束)为ExprN,
从[mytable]
其中(I1+I2+I3+I4+[…+]IN)0

您可以在[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中的零和null等。请注意,在这种情况下,每个结果列可以有不同的值。

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

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中的零和null,等等。注意,在这种情况下,每个结果列可以有不同的值。

这将只返回一个列,与OPR中提到的不同。这就是我现在正在做的。我希望能找到一个更有效的解决方案,因为这让人感觉很不舒服。他要求的是一个更简单的版本(!)=),它只返回一个列,不像OPS中提到的那样。这就是我现在正在做的。我希望能找到一个更有效的解决方案,因为这让人感觉很不舒服。他确实要求一个更简单的版本(!)=)我想你们被困在零行了吧?因为另一种处理方法是,如果不再需要它们,就将它们移除。然后是一个简单的
计数(*)
。我考虑过这一点,但我不能删除它们,因为这些非值在其他地方使用。我还考虑过将它们全部更新为NULL,但我无法验证0值在我正在使用的代码库中的任何地方都不应该出现。我想您一定是被零行卡住了吧?因为另一种处理方法是,如果不再需要它们,就将它们移除。然后是一个简单的
计数(*)
。我考虑过这一点,但我不能删除它们,因为这些非值在其他地方使用。我还考虑过将它们全部更新为NULL,但我无法验证在我正在使用的代码库中是否不需要0值。我想我明白了。这仍然需要我对我需要的每一个专栏都这样做,对吗?我想我明白了。这仍然需要我对我需要的每一个专栏都这样做,对吗?不,你的第一个解决方案就是我想要的。除了在列中添加每一个I1..在语法上更容易之外,它几乎就是我所拥有的。我只是不知道是否有更好的解决方案。不,你的第一个解决方案就是我要找的。除了在列中添加每一个I1..在语法上更容易之外,它几乎就是我所拥有的。我只是不知道是否有更好的解决方案。这是个好主意。我只采用了简单的方法,但我需要稍后再讨论这个问题。我认为这可能是一个更好的长期解决方案,直到我确定是否可以安全地更换或全部重新安装