以下是我的尝试:
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
此查询可以变得更简单吗?
答案 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
)
我的帖子0
和NULL
SUM
,AVG
- 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