2016-01-21 20 views
2

这里是我的尝试:如何总结一个科拉姆的价值除了负数或零在SQL

SELECT SUM(PQ.QuotaValue) 
FROM PackageQuotas AS PQ 
JOIN (
    SELECT DISTINCT PackageID, 
        ParentPackageID 
    FROM Packages 
    WHERE ParentPackageID = @ParentPackageID 
) PA ON PQ.PackageID = PA.PackageID 
WHERE PQ.QuotaID = @QuotaID 

共用列是表与PackageQuotas的包标识包的ParentPackageID。

的问题是如何避免增加PackageQuotas

的负数这个查询可以变得更简单?

+3

WHERE PQ.QuotaValue> 0'? – Devart

+0

Ok.let我尝试了一下,但可以让整个查询变得更简单吗? –

+0

它不能比这更简单。 – jarlh

回答

2
CREATE /* UNIQUE */ INDEX ix ON dbo.PackageQuotas (QuotaID, PackageID) 
    INCLUDE (QuotaValue) 
    WHERE QuotaValue > 0 

SELECT SUM(q.QuotaValue) 
FROM dbo.PackageQuotas q /* WITH(INDEX(ix)) */ 
WHERE q.QuotaID = @QuotaID 
    AND q.QuotaValue > 0 
    AND EXISTS(
      SELECT 1 
      FROM dbo.Packages p 
      WHERE p.ParentPackageID = @ParentPackageID 
       AND q.PackageID = p.PackageID 
     ) 

我的一篇关于0NULLSUMAVG - http://blog.devart.com/what-is-faster-inside-stream-aggregate-hash-match.html

+0

,为什么这比初始脚本更好?只是为了知道 –

+0

为什么更好?不必要的'DISTINCT'导致'Sort Distinct'操作。只要检查你的执行计划。另外,过滤后的索引可能会改善你的表演效果 – Devart

+0

谢谢! –

1

在where子句附加条件取出空负值

SELECT SUM(PQ.QuotaValue) 
    FROM PackageQuotas AS PQ 
    JOIN (
     SELECT DISTINCT PackageID, 
         ParentPackageID 
     FROM Packages 
     WHERE ParentPackageID = @ParentPackageID 
    ) PA ON PQ.PackageID = PA.PackageID 
    WHERE PQ.QuotaID = @QuotaID AND PQ.QuotaValue IS NOT NULL AND PQ.QuotaValue > 0 
+0

谢谢它的作品!我正在学习 –

1

尝试CASESELECT声明

SELECT SUM(CASE WHEN PQ.QuotaValue > 0 THEN PQ.QuotaValue ELSE 0 END) 
FROM PackageQuotas AS PQ 
JOIN (
SELECT DISTINCT PackageID, 
       ParentPackageID 
FROM Packages 
WHERE ParentPackageID = @ParentPackageID 
) PA ON PQ.PackageID = PA.PackageID 
WHERE PQ.QuotaID = @QuotaID