如何在SQL Server中的case语句中执行SUM()

Ath*_*hos 10 sql sql-server

我想在我的case语句中添加一些计算来动态创建新列的内容但是我收到错误:

列'Test1.qrank'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.

这是我正在研究的代码

case 
    when test1.TotalType = 'Average' then Test2.avgscore
    when test1.TotalType = 'PercentOfTot' then (cnt/SUM(test1.qrank))
    else cnt
end as displayscore
Run Code Online (Sandbox Code Playgroud)

我确实试图分组,但它没有用.

任何提示?

小智 21

当您在GROUP BY语句中使用子句而不将其包含在select中时,可能会发生您发布的错误.

这一个有效!

     SELECT t.device,
            SUM(case when transits.direction = 1 then 1 else 0 end) ,
            SUM(case when transits.direction = 0 then 1 else 0 end) from t1 t 
            where t.device in ('A','B') group by t.device
Run Code Online (Sandbox Code Playgroud)

这个没有(从选择中省略了t.device)

     SELECT 
            SUM(case when transits.direction = 1 then 1 else 0 end) ,
            SUM(case when transits.direction = 0 then 1 else 0 end) from t1 t 
            where t.device in ('A','B') group by t.device
Run Code Online (Sandbox Code Playgroud)

这将产生您的错误,抱怨我正在分组未包含在选择中的内容

请提供所有查询以获得更多支持.


Ric*_*iwi 0

如果您使用的是 SQL Server 2005 或更高版本,则可以使用窗口功能SUM() OVER ()

case 
when test1.TotalType = 'Average' then Test2.avgscore
when test1.TotalType = 'PercentOfTot' then (cnt/SUM(test1.qrank) over ())
else cnt
end as displayscore
Run Code Online (Sandbox Code Playgroud)

但如果您显示完整的查询以获取您实际需要的上下文,那就更好了。