2016-01-21 21 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