我在此查询中遇到两个问题:
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,但是当我这样做时,它会抛出错误:
无法对包含聚合或子查询的表达式执行聚合函数。
我尝试了很多但是没有用。
答案 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)
我喜欢将此视为通过结果创建计数标记并将其总结等同于计算它们。