如何实现当Kurvtilmeldingsvalg表无对应Kurv引用行时SQL查询返回0
嘿,我来帮你搞定这个问题!
你现在遇到的核心问题其实很明确:当Kurv表的行没有对应的Kurvtilmeldingsvalg记录时,你的查询返回了1,但你想要的是0。这完全是因为你用了ISNULL(SUM(...), 1)——当没有匹配行时,SUM()的结果会是NULL,而你让ISNULL把这个NULL替换成了1,这就和预期不符了。
另外,你之前尝试用子查询的方式解决,之所以报错是因为聚合函数(比如SUM)内部不能嵌套子查询或其他聚合函数,这个思路本身就行不通。
给你调整后的SQL语句,完全能满足需求:
SELECT Kurv.Id AS KurvID, ISNULL(SUM( CASE WHEN KurvTilmeldingsvalg.Antal - KurvTilmeldingsvalg.OriginalAntalSolgte < 0 THEN 0 WHEN nc_valglinjeBase.nc_deltageroptaelling IS NULL THEN 0 ELSE (KurvTilmeldingsvalg.Antal - KurvTilmeldingsvalg.OriginalAntalSolgte) * nc_valglinjeBase.nc_deltageroptaelling END ), 0) AS TotalAntal FROM Kurv LEFT JOIN Kurvtilmeldingsvalg ON Kurv.Id = KurvTilmeldingsvalg.KurvId LEFT JOIN nc_valglinjeBase ON KurvTilmeldingsvalg.Valglinje = nc_valglinjeBase.nc_valglinjeId WHERE Kurv.Status in (0, 1, 2, 13/*,14*/) GROUP BY Kurv.Id ORDER BY TotalAntal DESC
我做了两处关键调整:
- 把
ISNULL的第二个参数从1改成了0,这样当没有匹配的Kurvtilmeldingsvalg行时,SUM()返回的NULL会被替换成0,正好符合你的要求。 - 新增了
WHEN nc_valglinjeBase.nc_deltageroptaelling IS NULL THEN 0的判断——如果Kurvtilmeldingsvalg有记录,但关联的nc_valglinjeBase行不存在,这部分计算会返回0,而不是被SUM忽略(因为NULL在聚合时会被跳过),让结果更准确。
这样修改后,不管是没有Kurvtilmeldingsvalg对应行的情况,还是关联nc_valglinjeBase失败的情况,都能正确返回0,有有效记录时也能正常计算总和。
内容的提问来源于stack exchange,提问作者Leth
相关产品推荐
相关产品推荐

