10

我想在我的 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

我确实尝试过分组,但没有成功。

有什么提示吗?

4

3 回答 3

22

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

例子

这个有效!

     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

这一个不是(从选择中省略了 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

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

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

于 2012-09-27T19:39:33.560 回答
1

您可以先使用公用表表达式创建 SUM,将其连接到表中,然后根据需要使用 WHEN 从 CTE 或原始表中获取值。

WITH PercentageOfTotal (Id, Percentage) 
AS 
(
    SELECT Id, (cnt / SUM(AreaId)) FROM dbo.MyTable GROUP BY Id
)
SELECT 
    CASE
        WHEN o.TotalType = 'Average' THEN r.avgscore
        WHEN o.TotalType = 'PercentOfTot' THEN pt.Percentage
        ELSE o.cnt
    END AS [displayscore]
FROM PercentageOfTotal pt
    JOIN dbo.MyTable t ON pt.Id = t.Id
于 2012-09-27T19:39:20.983 回答
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

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

于 2012-09-27T19:26:17.887 回答