You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现当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

我做了两处关键调整:

  1. 把ISNULL的第二个参数从1改成了0,这样当没有匹配的Kurvtilmeldingsvalg行时,SUM()返回的NULL会被替换成0,正好符合你的要求。
  2. 新增了WHEN nc_valglinjeBase.nc_deltageroptaelling IS NULL THEN 0的判断——如果Kurvtilmeldingsvalg有记录,但关联的nc_valglinjeBase行不存在,这部分计算会返回0,而不是被SUM忽略(因为NULL在聚合时会被跳过),让结果更准确。

这样修改后,不管是没有Kurvtilmeldingsvalg对应行的情况,还是关联nc_valglinjeBase失败的情况,都能正确返回0,有有效记录时也能正常计算总和。

内容的提问来源于stack exchange,提问作者Leth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 10:43:14