Sql server 为什么计数函数不能返回准确的结果?

Sql server 为什么计数函数不能返回准确的结果?,sql-server,tsql,sql-server-2012,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.Prope

我在这个查询中有两个问题:

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)
问题:

计数行不返回实际计数,它甚至返回相同的计数,即使我写了其他内容而不是“商业/住宅”

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

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

我尝试了很多,但没有成功。

COUNTX计数为0,因此以下表达式:

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

要使COUNTX不计算行数,X必须为NULL

因此,将大小写表达式更改为:

COUNT(Case when .... else NULL end)
                          ^^^^
这将为您提供预期的结果。

COUNTX计数为0,因此这些表达式:

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

要使COUNTX不计算行数,X必须为NULL

因此,将大小写表达式更改为:

COUNT(Case when .... else NULL end)
                          ^^^^

这会给你预期的结果。

Lasse V.Karlsen给出的答案是正确的。您可能会看到另一个实现相同功能的成语是:

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

我喜欢把这看作是通过结果创建理货标记,并将它们相加等于计算它们。

Lasse V.Karlsen给出的答案是正确的。您可能会看到另一个实现相同功能的成语是:

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

我喜欢将此视为通过结果创建理货标记,并将其相加等于对其进行计数。

您是否有任何关于错误的信息,例如,您能否给出一个数据计数的示例,它产生的值以及您期望的值?我很确定COUNT会返回准确的结果,前提是基础数据库没有问题,如索引损坏或类似问题。此外,请一次只关注一个问题,否则您可能会在此处得到答案,而这些答案只回答了部分问题,这使得您很难/不可能选择一个答案作为已接受答案,只是因为没有一个答案是合格的。请发布示例数据、预期结果和实际结果-如果没有这些,调试查询是非常困难的。但是,我猜您是在尝试应用where子句,当PT.PropertyTypeName='Commercial'然后PD.PropertyDetailsTotalAmount else 0结束位时,这几乎肯定是问题所在。另外,您是否知道SUMX其中X有时是值0,但仍然计算该值?好的,先生,我会的。计数对商业和住宅都返回相同的结果。您是否有任何关于错误的信息,例如,您能否举例说明它计数的数据、产生的价值以及您预期的价值?我很确定COUNT会返回准确的结果,前提是基础数据库没有问题,如索引损坏或类似问题。此外,请一次只关注一个问题,否则您可能会在此处得到答案,而这些答案只回答了部分问题,这使得您很难/不可能选择一个答案作为已接受答案,只是因为没有一个答案是合格的。请发布示例数据、预期结果和实际结果-如果没有这些,调试查询是非常困难的。但是,我猜您是在尝试应用where子句,当PT.PropertyTypeName='Commercial'然后PD.PropertyDetailsTotalAmount else 0结束位时,这几乎肯定是问题所在。另外,您是否知道SUMX其中X有时是值0,但仍然计算该值?好的,先生,我会的。计数返回商业和住宅的相同结果。