我想在我的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
我确实尝试过分组但是没有用。
任何提示?
答案 0 :(得分: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
这不是(从选择中省略了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
这会产生您的错误,抱怨我正在为未包含在选择
中的内容进行分组请提供所有查询以获得更多支持。
答案 1 :(得分: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
答案 2 :(得分: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
但如果你展示完整的查询以获得你真正需要的背景,那就更好了。