SQL Server:排除具有特定值的行

时间:2016-05-11 19:54:09

标签: sql-server vb.net tsql

我需要一个查询,以排除过去10天内列Amount1, Amount2, Amount3, Amount4的值为0的记录。

这是我的尝试。有没有更好或更正确的方法呢?

Select 
    count(*) 
from 
    table
Where 
    Amount1 Not In (select Amount1 from table where Amount1 = 0)
    And Amount2 Not In (select Amount2 from table where Amount2 = 0)
    And Amount3 Not In (select Amount3 from table where Amount3 = 0) 
    And Amount4 Not In (select Amount4 from table where Amount4 = 0)
    And Amount1 = ' & Item1 & '
    And Amount2 = ' & Item2 & '
    And Amount3 = ' & Item3 & '
    And Amount4 = ' & Item4 & '
    And DateColumn > = DateAdd(dd, -10, getdate())

2 个答案:

答案 0 :(得分:0)

我可能会误解,但你过度复杂了......

SELECT COUNT(*) from table
WHERE Amount1 <> 0
AND Amount2 <> 0
AND Amount3 <> 0
AND Amount4 <> 0
AND DateColumn > = DateAdd("dd", -10, GetDate())

如果您知道您的金额值不能为负值,请使用&gt; 0,它比&lt;&gt; 0更有效。

什么是&#34; item1&#34;那里的东西?你在问题中没有提到这一点。

此外,您需要getdate&#34; dd&#34;的引号。

答案 1 :(得分:0)

您目前接近此方式的重大性能问题。嵌套的sub-selects会破坏当前查询的性能。这是另一种方法......

*将@table替换为您的表名...

SELECT COUNT(*) FROM @table
WHERE EXISTS(
                SELECT *
                FROM @table
                WHERE 
                    Amount1 > 0 AND
                    Amount2 > 0 AND
                    Amount3 > 0 AND
                    Amount4 > 0 AND
                    DateColumn >= DATEADD(DAY, -10, GETDATE())
            )  

另一方面,您错误地使用了DateAdd。它应该是:DATEADD(DAY, -10, GETDATE())

以上是来自上方的查询证据......

enter image description here