为什么不计算函数返回准确的结果?

时间:2016-11-15 07:45:07

标签: sql-server tsql sql-server-2012

我在此查询中遇到两个问题:

SELECT DATENAME(MONTH, pd.PaymentDate) + ' ' + DATENAME(YEAR, pd.PaymentDate) AS PDate,
    SUM(Case when PT.PropertyTypeName = 'Commercial' then PD.PropertyDetailsTotalAmount else 0 END) as CommercialIncome, 
    SUM(Case when PT.PropertyTypeName = 'Residential' then PD.PropertyDetailsTotalAmount else 0 END) as ResidentialIncome,
    COUNT(Case when PT.PropertyTypeName = 'Commercial' then PD.pk_PropertyDetails_PropertyDetailsID else 0 END) as TotalCommercialMaps,
    COUNT(Case when PT.PropertyTypeName = 'Residential' then PD.pk_PropertyDetails_PropertyDetailsID else 0 END) as TotalResidentialMaps
From PropertyDetails PD
     Inner Join Properties P
         ON PD.fk_Properties_ID= p.pk_Properties_ID
     Inner Join PropertyTypes PT
         ON PT.pk_PropertyTypes_PropertyTypeID= P.fk_PropertyTypes_ID
where
    PD.Paid= 1 
    --and PaymentDate >= @DateFrom AND PaymentDate < DATEADD(day,1,@DateTo)
Group By DATENAME(MONTH, pd.PaymentDate) + ' ' + DATENAME(YEAR, pd.PaymentDate)

问题:

  1. 计数行不返回实际计数,即使我写了别的东西而不是“商业/住宅”,它甚至会返回相同的计数

  2. 我想得到两个计数的总和,即TotalCommercialResidentialMaps,但是当我这样做时,它会抛出错误:

    无法对包含聚合或子查询的表达式执行聚合函数。

  3. 我尝试了很多但是没有用。

2 个答案:

答案 0 :(得分:4)

onStop计算COUNT(X)所以这些表达式:

0

将计算所有行,假设COUNT(Case when PT.PropertyTypeName = 'Commercial' then PD.pk_PropertyDetails_PropertyDetailsID else 0 END) 为非空。

要让PD.pk_PropertyDetails_PropertyDetailsID 计算一行,COUNT(X)必须为X

因此,请将您的案例表达式更改为:

NULL

这应该会给你预期的结果。

答案 1 :(得分:0)

Lasse V. Karlsen给出的答案是正确的。你可能会看到另一个完成同样事情的成语是:

SUM(Case when PT.PropertyTypeName = 'Commercial' then 1 else 0 end)

我喜欢将此视为通过结果创建计数标记并将其总结等同于计算它们。