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,但仍然计算该值?好的,先生,我会的。计数返回商业和住宅的相同结果。