如何将除负数之外的一个列的值相加或在SQL中为null

时间:2016-01-21 11:08:52

标签: sql sql-server

以下是我的尝试:

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

common列是使用PackageQuotas中的PackageId的表Packages的ParentPackageID。

问题是如何避免添加列PackageQuotas

的负数

此查询可以变得更简单吗?

3 个答案:

答案 0 :(得分: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
        )

我的帖子0NULL SUMAVG - http://blog.devart.com/what-is-faster-inside-stream-aggregate-hash-match.html

答案 1 :(得分:1)

通过在Where子句中添加条件

来删除null和Negative值
 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 

答案 2 :(得分:1)

CASE声明

中尝试SELECT
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